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 Io\TcpdfBundle\IoTcpdfBundle(),
new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(), new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(), new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(),
new Ivory\CKEditorBundle\IvoryCKEditorBundle(),
new GergelyPolonkai\FrontBundle\GergelyPolonkaiFrontBundle(), new GergelyPolonkai\FrontBundle\GergelyPolonkaiFrontBundle(),
new GergelyPolonkai\GeshiBundle\GergelyPolonkaiGeshiBundle(), 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: security:
encoders: encoders:
Symfony\Component\Security\Core\User\User: plaintext GergelyPolonkai\FrontBundle\Entity\User:
id: gergely_polonkai_front.service.crypt_encoder
role_hierarchy: role_hierarchy:
ROLE_ADMIN: ROLE_USER ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers: providers:
in_memory: gergely_polonkai_front.entity.user:
memory: entity:
users: class: GergelyPolonkai\FrontBundle\Entity\User
user: { password: userpass, roles: [ 'ROLE_USER' ] } property: username
admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
firewalls: firewalls:
dev: dev:
@ -23,17 +23,17 @@ security:
security: false security: false
login: login:
pattern: ^/demo/secured/login$ pattern: ^/admin/login.html$
security: false security: false
secured_area: secured_area:
pattern: ^/demo/secured/ pattern: ^/admin
form_login: form_login:
check_path: /demo/secured/login_check check_path: /admin/login-check.do
login_path: /demo/secured/login login_path: /admin/login.html
logout: logout:
path: /demo/secured/logout path: /admin/logout
target: /demo/ target: /
#anonymous: ~ #anonymous: ~
#http_basic: #http_basic:
# realm: "Secured Demo Area" # realm: "Secured Demo Area"

View File

@ -24,9 +24,10 @@
"sensio/generator-bundle": "2.1.*", "sensio/generator-bundle": "2.1.*",
"jms/security-extra-bundle": "1.2.*", "jms/security-extra-bundle": "1.2.*",
"jms/di-extra-bundle": "1.1.*", "jms/di-extra-bundle": "1.1.*",
"easybook/geshi": "dev-master", "easybook/geshi": "dev-master",
"stof/doctrine-extensions-bundle": "dev-master", "stof/doctrine-extensions-bundle": "dev-master",
"doctrine/doctrine-migrations-bundle": "dev-master", "doctrine/doctrine-migrations-bundle": "dev-master",
"egeloen/ckeditor-bundle": "dev-master",
"gergelypolonkai/tcpdfbundle": "dev-master" "gergelypolonkai/tcpdfbundle": "dev-master"
}, },
"scripts": { "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 Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as GedmoORM; use Gedmo\Mapping\Annotation as GedmoORM;
use Symfony\Component\Validator\Constraints as Assert;
/** /**
* Description of Post * Description of Post
@ -36,6 +37,7 @@ class Post
* @var string $title * @var string $title
* *
* @ORM\Column(type="string", length=100) * @ORM\Column(type="string", length=100)
* @Assert\NotBlank()
*/ */
private $title; private $title;
@ -51,6 +53,7 @@ class Post
* @var string $content * @var string $content
* *
* @ORM\Column(type="text", nullable=false) * @ORM\Column(type="text", nullable=false)
* @Assert\NotBlank()
*/ */
private $content; private $content;
@ -160,4 +163,30 @@ class Post
{ {
return $this->createdAt; 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; namespace GergelyPolonkai\FrontBundle\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/** /**
* Description of User * Description of User
@ -11,7 +12,7 @@ use Doctrine\ORM\Mapping as ORM;
* @ORM\Entity * @ORM\Entity
* @ORM\Table(name="users") * @ORM\Table(name="users")
*/ */
class User class User implements UserInterface
{ {
/** /**
* @ORM\Id * @ORM\Id
@ -30,6 +31,29 @@ class User
*/ */
private $name; 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 * Get id
* *
@ -85,4 +109,26 @@ class User
{ {
return $this->name; 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->set_source($code);
$this->geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS); $this->geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
$this->geshi->enable_keyword_links(false); $this->geshi->enable_keyword_links(false);
$this->geshi->set_overall_class("code");
$this->geshi->enable_classes(); $this->geshi->enable_classes();
return $this->geshi->parse_code(); return $this->geshi->parse_code();