JSF 与 Spring Security 的集成

Posted

技术标签:

【中文标题】JSF 与 Spring Security 的集成【英文标题】:Integration of JSF with Spring Security 【发布时间】:2013-09-23 14:30:24 【问题描述】:

对不起我的英语。 JSF 与 Spring Security 集成的问题。

我做了什么:

    在实体User实现接口UserDetails 接口UserDAO扩展接口UserDetailsService

    UserHibernateDAO实现接口UserDAO

    在 LoginMB 中如果要添加方法login():

    public void login() 
            UserDetails user = getDao().loadUserByUsername("admin2@admin.ru");
            password= user.getPassword();
     
    

    然后按预期显示密码,即步骤 1-3 正在工作。

    在applicationContext-security.xml中我要添加:

    <beans:bean id="UserDAO" class="com.otv.model.dao.hibernate.UserHibernateDAO" />
    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="UserDAO" />
    </authentication-manager>
    

    在登录MB中:

    public class LoginMB implements Serializable 
    
        private static final long serialVersionUID = 1L;
    
        @Qualifier("authenticationManager")
        AuthenticationManager authenticationManager;
    
        private String userName;
        private String password;
    
        public String login() 
    
            UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("admin2@admin.ru", "2");
    
            // next line is 54 
            Authentication authenticate = authenticationManager.authenticate(token);            
    
            if (authenticate.isAuthenticated()) 
                SecurityContextHolder.getContext().setAuthentication(authenticate);
            
            return "success";
        
    
        //get and set metods
    
    
    

它打印错误:

javax.faces.FacesException: #loginMB.login: java.lang.NullPointerException
...
java.lang.NullPointerException
    at com.otv.managed.bean.LoginMB.login(LoginMB.java:54)

我怎么想,在 LoginMB 中不起作用@Qualifier 注释:

@Qualifier("authenticationManager")
AuthenticationManager authenticationManager;

请告诉我如何在另一个链接 authenticationManager 上?

【问题讨论】:

请更新问题以仅显示问题。将 问题已解决 部分移到答案中,然后等待两天接受。 【参考方案1】:

来自 applicationContext-security.xml 不起作用@ManagedProperty。为什么?

    在 LoginMB 中我添加了:

    @ManagedProperty(value="#authenticationManager")
    AuthenticationManager authenticationManager;
    

    在 applicationContext.xml 我添加了:

    <sec:http auto-config="true">
    
        <sec:form-login login-page="/pages/login.html" authentication-failure-url="/fail.html" />
        <sec:intercept-url pattern="/pages/service/*" access="ROLE_SHIPPER" />
        <sec:intercept-url pattern="/pages/task/*" access="ROLE_CARRIER" />
    
    </sec:http>
    
    <sec:authentication-manager alias="authenticationManager">
        <sec:authentication-provider user-service-ref="UserDAO">
            <sec:password-encoder hash="plaintext" />
        </sec:authentication-provider>
    </sec:authentication-manager>
    

它正在工作!

【讨论】:

以上是关于JSF 与 Spring Security 的集成的主要内容,如果未能解决你的问题,请参考以下文章

我们可以集成 JSF 2.0 + Spring 4.2.X + Spring Security 4.2.X [重复]

Tomcat 上的 Spring Security/JSF/Hibernate 意外会话劫持?

Spring JSF 集成:如何在 JSF 托管 bean 中注入 Spring 组件/服务?

j_spring_security_check 404 JSF 登录错误

在 JSF、Spring、Spring-Security 项目中是不是需要 faces-config.xml? [复制]

使用spring security时无法访问jsf页面,出现403