我的系统有2个子系统。每个子系统都有不同的用户组。每个用户都有一个额外的字段“SystemName”,可用于了解该用户所属的系统。
在登录表单(每个子系统的1个表单)中,我添加了一个隐藏字段,指定表单的类型(包含SystemName值)。
一般来说,检查很简单:
if (user.systemName == params.systemName) {
proceed with regular login
} else {
throw standard login error
}
我尝试将该检查放到我的自定义DaoAuthenticationProvider中,但它无法访问“params.systemName”。
我在哪里放置该代码以使Acegi通过此检查对我的用户进行身份验证?
提前致谢。
答案 0 :(得分:1)
这就是我用Java做的。扩展 WebAuthenticationDetails :
import javax.servlet.http.HttpServletRequest;
import org.acegisecurity.ui.WebAuthenticationDetails;
public class SystemNameWebAuthenticationDetails extends WebAuthenticationDetails {
public SystemNameWebAuthenticationDetails() {
super();
}
public SystemNameWebAuthenticationDetails(HttpServletRequest request) {
super(request);
this.systemName = request.getParameter("systemName");
}
public String getSystemName() {
return systemName;
}
private String systemName;
}
在身份验证过滤器中设置:
<bean id="authenticationProcessingFilter"
class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
...
<property name="authenticationDetailsSource">
<bean class="org.acegisecurity.ui.AuthenticationDetailsSourceImpl">
<property name="clazz" value="SystemNameWebAuthenticationDetails"/>
</bean>
</property>
</bean>
稍后您可以在身份验证过程中访问该属性,询问身份验证对象的详细信息。或者这样做:
SecurityContextHolder.getContext().getAuthentication().getDetails()