当用户在一个网站(站点 A)上进行预验证并单击指向我的另一个站点(站点 B)的链接时,一切正常。
除非有用户在同一浏览器上登录站点 B,否则永远不会调用 PreAuthenticatedProcessingFilter。所以我需要的是预授权登录以覆盖当前用户(如果有的话)。
我正在发送两个 token 作为 URL 参数并使用它们对用户进行身份验证。有谁知道我是否可以获得预认证过滤器来覆盖当前用户或其他一些方法?
相关代码:
安全应用程序上下文.xml
<beans:bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService" ref="userDetailsServiceWrapper"/>
</beans:bean>
<beans:bean id="PreAuthenticatedProcessingFilter" class="MyProject.login.PreAuthenticatedProcessingFilter">
<beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>
<beans:bean id="userDetailsServiceWrapper" class="MyProject.login.UserDetailServicePreAuth" />
PreAuthenticatedProcessingFilter
public class PreAuthenticatedProcessingFilter extends AbstractPreAuthenticatedProcessingFilter {
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
if(request.getParameter("idnumber") != null){
return request.getParameter("idnumber");
}
return null;
}
@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
String[] credentials = new String[3];
if(request.getParameter("idnumber") != null){
credentials[0] = request.getParameter("token");
credentials[1] = request.getParameter("A");
credentials[2] = request.getServletPath();
return credentials;
}
return null;
}
AuthenticationUserDetailsService
public class UserDetailServicePreAuth implements AuthenticationUserDetailsService<Authentication> {
@Override
public UserDetails loadUserDetails(Authentication authentication) throws UsernameNotFoundException {
String id = (String) authentication.getPrincipal();
String[] p = (String[]) authentication.getCredentials();
String token = p[0];
User user = new User();
user = UserData.getUserPreAuth(id, token);
return user;
}
但问题是,当用户登录并调用带有参数(idnumber 和 token )的 url 时,什么也没有发生,URL 参数被忽略,登录的用户仍然登录。
有没有一种方法可以用这种方法覆盖用户?
最佳答案
您需要设置 checkForPrincipalChanges
如果您希望现有的登录 session 失效,请将该属性设置为 true
。
<beans:bean id="PreAuthenticatedProcessingFilter" class="MyProject.login.PreAuthenticatedProcessingFilter">
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="checkForPrincipalChanges" value="true" />
</beans:bean>
关于java - 如果另一个用户登录,预身份验证不起作用 - Spring 安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29344926/