在symfony2和BeSimpleSsoAuthBundle(或其他建议)中使用CAS进行用户身份验证

时间:2014-05-23 16:40:35

标签: php security symfony login cas

我正在使用涉及CAS服务器的symfony2进行一个web项目:http://www.jasig.org/cas遗憾的是我无法使其正常工作。我尝试了几种配置,我所做的任何事情都是正确的。这是我希望为任何想要记录的用户做的通量:

  1. 用户想要登录我的系统
  2. 我的系统以某种方式将用户重定向到cas服务器登录网页,以使用用户凭据登录。
  3. 有效登录后,cas服务器登录网页会将用户重定向回我的系统。
  4. 我的系统根据协议机制知道用户是否记录良好。
  5. 我找到了symfony2的Bundle BeSimpleSsoAuthBundle(https://github.com/BeSimple/BeSimpleSsoAuthBundle),但我不确定它是否正常工作,因为它看起来有点旧。按照代表的说明,以下是我的所有配置:

    对于config.yml

    be_simple_sso_auth:
        admin_sso:
            protocol:
                id: cas
                version: 2
            server:
                id: cas
                login_url: https://cas_server.fi/cas/login
                validation_url: https://cas_server.fi/cas/serviceValidate
    

    对于security.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:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
            my_firewall:
                pattern: ^/
                anonymous: ~
                trusted_sso:
                    manager: admin_sso
                    login_action: false
                    create_users: true
                    created_users_roles: [ROLE_ADMIN]
                    check_path: /
    

    cas服务器为我提供了两个我已经安装在Ubuntu 13.10中的.crt文件。或者至少我认为......但是之前的任何配置似乎都不需要这些证书,因为我无法指定捆绑包可以找到它们的位置。无论如何它还没有用,所以这一步可能无关紧要。

    那么,现在发生的是下一个:

    1. 用户首次访问 /
    2. 我的系统将他重定向到 / login (据我所知,这是默认方向......)
    3. 要管理这个 / login ,我在自己的bundle中有routing.yml:

      ss_web_login:
          path: /login
          defaults: { _controller: BeSimpleSsoAuthBundle:TrustedSso:login }
      

      我已经检查了这个控制器,它看起来像是在某个地方画了一个锚点#34; (我猜是我的cas服务器的登录表单。

      让我们继续...正如我所说,用户被重定向到/ login但是我收到了错误:

      Controller "BeSimple\SsoAuthBundle\Controller\TrustedSsoController::loginAction()" requires that you provide a value for the "$manager" argument (because there is no default value or because there is a non optional argument after this one).
      

      这是因为BeSimpleSsoAuthBundle:TrustedSso:login需要不同的参数:

      public function loginAction(Manager $manager, Request $request, AuthenticationException $exception = null)
      

      但是没有人传递它期望的这些参数。我该怎么办?

      如果你有任何关于让这项工作有任何其他建议的话,我将非常感激。甚至建议我使用另一个cas客户端或不同的实现(但我需要让它工作)。

      非常感谢你。

1 个答案:

答案 0 :(得分:0)

就此错误而言 - 控制器“BeSimple \ SsoAuthBundle \ Controller \ TrustedSsoController :: loginAction()”要求您为“$ manager”参数提供一个值(因为没有默认值或因为没有这之后的可选参数)。

担心,解决/解决此问题的实际答案是在security.yml提供程序密钥中提供正确的用户提供程序,并在防火墙的提供程序密钥中使用它。

例如。供应商:            管理员:               entity:{class:UserBundle \ Entity \ User}

在所需的防火墙下,使用provider:administrators作为键:值。

此问题得到解决。

另请注意,需要对匿名密钥进行注释。匿名用户密钥不会填充$ manager