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? [复制]