1

我一直在寻找解决方案,但找不到任何可以解决我的问题的答案。我有最简单的表单登录(仍在学习 symfony2 ),但我不知道为什么它不起作用。

我的安全.yml

security:
encoders:
    Symfony\Component\Security\Core\User\User: plaintext

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' ] }

firewalls:
    secured_area:
        pattern:    ^/profile
        provider: in_memory
        form_login:
            check_path: _security_check
            login_path: _portal_login

            username_parameter: _username
            password_parameter: _password

access_control:
    - { path: ^/profile, roles: ROLE_ADMIN }

我的默认控制器

class DefaultController extends Controller
{ 

 /**
 * @Route("/login", name="_portal_login")
 * @Template()
 */
public function indexAction(Request $request)
{  
    $request = $this->getRequest();
    $session = $request->getSession();

    // get the login error if there is one
    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' => $request->getSession()->get(SecurityContext::LAST_USERNAME),
        'error'         => $error
    );

}

 /**
 * @Route("/login_check", name="security_check")
 */
public function securityCheckAction()
{
}

/**
 * @Route("/profile", name="profile_main")
 * @Template()
 */
public function profileAction()
{  
    return array();
}
}

并查看我的登录表单

{% if error %}
<div>{{ error.message }}</div>
{% endif %}

<form action="{{ path("security_check") }}" method="post" id="login">
<label for="username">Username:</label>
<input type="text" id="username" name="_username" value="{{ last_username }}" />

<label for="password">Password:</label>
<input type="password" id="password" name="_password" />

<button type="submit">login</button>
</form>

正如我所说 - 尽可能简单,点击“登录”后我得到异常

The controller must return a response (null given). Did you forget to add a return statement somewhere in your controller?

编辑 !!!!

刚刚找到一个解决方案:您需要编辑 security.yml 以便提供程序位于 form_login 部分 ^^

4

3 回答 3

1

在您的控制器中尝试此代码

/**
 * @Route("/login", name="_success_login")
 * @Template()
 */    
public function LoginAction() 
{
   //your code

   return $this->render('BundleName:Security:login.html.twig');
}

在安全.yml

 form_login:
        check_path: _security_check
        login_path: _success_login      

请看页面点击这里

于 2013-10-29T12:39:13.453 回答
0

在此处阅读如何使用模板注释。或将您的退货声明更改为:

return $this->render('bundle:controller:template', array(
        'last_username' => $request->getSession()->get(SecurityContext::LAST_USERNAME),
        'error'         => $error
    ));

在此处阅读有关模板命名和位置的信息

于 2013-10-28T20:15:41.267 回答
0

您已指定只有位于“/profile”下的东西才应该被防火墙保护。将模式更改为:

secured_area:
    pattern:    ^/
    form_login:
        check_path: /login_check
        login_path: /login

这将需要对您的整个应用程序进行身份验证和授权。或者

secured_area:
    pattern:    ^/Admin
    form_login:
        check_path: /login_check
        login_path: /login

这将只需要对 /Admin 下的路由进行身份验证和授权。

您没有发布您的 routing.yml 文件,但您可能需要将您的 routing.yml 文件更改为:

login:
    pattern:  /login
    defaults: { _controller: SomeBundle:Authentication:logon }
login_check:
    pattern:  /login_check
logout:
    pattern:  /logout

然后我会将您的 DefaultController 重命名为 Authentication,因为这才是它真正在做的事情。

于 2013-10-28T19:55:01.250 回答