Added login and posting functionality

Signed-off-by: Gergely Polonkai (W00d5t0ck) <polesz@w00d5t0ck.info>
This commit is contained in:
Gergely Polonkai (W00d5t0ck) 2012-09-04 17:21:04 +02:00
parent 5bcd9f079b
commit 04d408aee0
12 changed files with 277 additions and 18 deletions

View File

@ -23,6 +23,7 @@ class AppKernel extends Kernel
new Io\TcpdfBundle\IoTcpdfBundle(),
new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(),
new Ivory\CKEditorBundle\IvoryCKEditorBundle(),
new GergelyPolonkai\FrontBundle\GergelyPolonkaiFrontBundle(),
new GergelyPolonkai\GeshiBundle\GergelyPolonkaiGeshiBundle(),
);

View File

@ -0,0 +1,28 @@
<?php
namespace Application\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration,
Doctrine\DBAL\Schema\Schema;
/**
* Auto-generated Migration: Please modify to your need!
*/
class Version20120904170638 extends AbstractMigration
{
public function up(Schema $schema)
{
// this up() migration is autogenerated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() != "mysql");
$this->addSql("ALTER TABLE users ADD password VARCHAR(50) NOT NULL");
}
public function down(Schema $schema)
{
// this down() migration is autogenerated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() != "mysql");
$this->addSql("ALTER TABLE users DROP password");
}
}

View File

@ -4,18 +4,18 @@ jms_security_extra:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
GergelyPolonkai\FrontBundle\Entity\User:
id: gergely_polonkai_front.service.crypt_encoder
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
in_memory:
memory:
users:
user: { password: userpass, roles: [ 'ROLE_USER' ] }
admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
gergely_polonkai_front.entity.user:
entity:
class: GergelyPolonkai\FrontBundle\Entity\User
property: username
firewalls:
dev:
@ -23,17 +23,17 @@ security:
security: false
login:
pattern: ^/demo/secured/login$
pattern: ^/admin/login.html$
security: false
secured_area:
pattern: ^/demo/secured/
pattern: ^/admin
form_login:
check_path: /demo/secured/login_check
login_path: /demo/secured/login
check_path: /admin/login-check.do
login_path: /admin/login.html
logout:
path: /demo/secured/logout
target: /demo/
path: /admin/logout
target: /
#anonymous: ~
#http_basic:
# realm: "Secured Demo Area"

View File

@ -24,9 +24,10 @@
"sensio/generator-bundle": "2.1.*",
"jms/security-extra-bundle": "1.2.*",
"jms/di-extra-bundle": "1.1.*",
"easybook/geshi": "dev-master",
"stof/doctrine-extensions-bundle": "dev-master",
"doctrine/doctrine-migrations-bundle": "dev-master",
"easybook/geshi": "dev-master",
"stof/doctrine-extensions-bundle": "dev-master",
"doctrine/doctrine-migrations-bundle": "dev-master",
"egeloen/ckeditor-bundle": "dev-master",
"gergelypolonkai/tcpdfbundle": "dev-master"
},
"scripts": {

View File

@ -0,0 +1,79 @@
<?php
namespace GergelyPolonkai\FrontBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Security\Core\SecurityContext;
use GergelyPolonkai\FrontBundle\Form\PostType;
use GergelyPolonkai\FrontBundle\Entity\Post;
/**
* Description of AdminController
*
* @author polonkai.gergely
*
* @Route("/admin")
*/
class AdminController extends Controller
{
/**
* @return array
*
* @Route("/login.html")
* @Template
*/
public function loginAction()
{
$request = $this->getRequest();
$session = $request->getSession();
if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
$error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
} else {
$error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
$session->remove(SecurityContext::AUTHENTICATION_ERROR);
}
return array(
'last_username' => $session->get(SecurityContext::LAST_USERNAME),
'error' => $error,
);
}
/**
* @Route("/login-check.do", name="GergelyPolonkaiFrontBundle_adminLoginCheck")
*/
public function loginCheckAction()
{
}
/**
* @Route("/blog/post", name="GergelyPolonkaiFrontBundle_adminNewBlogPost")
* @Template
*/
public function newBlogPostAction()
{
$post = new Post();
$form = $this->createForm(new PostType(), $post);
$request = $this->getRequest();
$user = $this->get('security.context')->getToken()->getUser();
if ($request->getMethod() === 'POST') {
$form->bind($request);
if ($form->isValid()) {
$post->setUser($user);
$em = $this->getDoctrine()->getEntityManager();
$em->persist($post);
$em->flush();
return $this->redirect($this->generateUrl('GergelyPolonkaiFrontBundle_adminNewBlogPost'));
}
}
return array(
'form' => $form->createView(),
);
}
}

View File

@ -4,6 +4,7 @@ namespace GergelyPolonkai\FrontBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as GedmoORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Description of Post
@ -36,6 +37,7 @@ class Post
* @var string $title
*
* @ORM\Column(type="string", length=100)
* @Assert\NotBlank()
*/
private $title;
@ -51,6 +53,7 @@ class Post
* @var string $content
*
* @ORM\Column(type="text", nullable=false)
* @Assert\NotBlank()
*/
private $content;
@ -160,4 +163,30 @@ class Post
{
return $this->createdAt;
}
}
/**
* Set slug
*
* @param string $slug
* @return Post
*/
public function setSlug($slug)
{
$this->slug = $slug;
return $this;
}
/**
* Set createdAt
*
* @param \DateTime $createdAt
* @return Post
*/
public function setCreatedAt($createdAt)
{
$this->createdAt = $createdAt;
return $this;
}
}

View File

@ -2,6 +2,7 @@
namespace GergelyPolonkai\FrontBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Description of User
@ -11,7 +12,7 @@ use Doctrine\ORM\Mapping as ORM;
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User
class User implements UserInterface
{
/**
* @ORM\Id
@ -30,6 +31,29 @@ class User
*/
private $name;
/**
* @var string $password
*
* @ORM\Column(type="string", length=50, nullable=false)
*/
private $password;
public function __toString()
{
return $this->name . '(' . $this->username . ')';
}
public function getSalt() {
return $this->password;
}
public function eraseCredentials() {
}
public function getRoles() {
return array('ROLE_ADMIN');
}
/**
* Get id
*
@ -85,4 +109,26 @@ class User
{
return $this->name;
}
}
/**
* Set password
*
* @param string $password
* @return User
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
/**
* Get password
*
* @return string
*/
public function getPassword()
{
return $this->password;
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace GergelyPolonkai\FrontBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('content', 'ckeditor')
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'GergelyPolonkai\FrontBundle\Entity\Post'
));
}
public function getName()
{
return 'gergelypolonkai_frontbundle_posttype';
}
}

View File

@ -0,0 +1,13 @@
{% extends 'GergelyPolonkaiFrontBundle:Default:front_base.html.twig' %}
{% block content %}
<h3>Bejelentkezés</h3>
{% if error %}
<div id="error">{{ error }}</div>
{% endif %}
<form method="post" action="{{ path('GergelyPolonkaiFrontBundle_adminLoginCheck') }}">
<input type="text" name="_username" vale="{{ last_username }}" />
<input type="password" name="_password" />
<button type="submit">Login</button>
</form>
{% endblock %}

View File

@ -0,0 +1,8 @@
{% extends 'GergelyPolonkaiFrontBundle:Default:front_base.html.twig' %}
{% block content %}
<form method="post" action="{{ path('GergelyPolonkaiFrontBundle_adminNewBlogPost') }}">
{{ form_widget(form) }}
<button type="submit">Save</button>
</form>
{% endblock content %}

View File

@ -0,0 +1,23 @@
<?php
namespace GergelyPolonkai\FrontBundle\Service;
use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface;
use JMS\DiExtraBundle\Annotation as DI;
/**
* Description of CryptEncoder
*
* @author polonkai.gergely
*
* @DI\Service("gergely_polonkai_front.service.crypt_encoder")
*/
class CryptEncoder implements PasswordEncoderInterface
{
public function encodePassword($raw, $salt) {
return crypt($raw);
}
public function isPasswordValid($encoded, $raw, $salt) {
return (crypt($raw, $encoded) === $encoded);
}
}

View File

@ -35,6 +35,7 @@ class GeshiHighlight extends \Twig_Extension
$this->geshi->set_source($code);
$this->geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
$this->geshi->enable_keyword_links(false);
$this->geshi->set_overall_class("code");
$this->geshi->enable_classes();
return $this->geshi->parse_code();