0

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

我做了什么:

  1. 在实体User实现的接口中UserDetails
  2. 接口UserDAO扩展接口UserDetailsService
  3. UserHibernateDAO实现的接口UserDAO

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

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

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

  4. 在 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>
    
  5. 在登录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 上?

4

1 回答 1

0

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

  1. 在 LoginMB 中,我添加了:

    @ManagedProperty(value="#{authenticationManager}")
    AuthenticationManager authenticationManager;
    
  2. 在 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>
    

这是工作!

于 2013-09-18T20:59:19.380 回答