java - 如果另一个用户登录,预身份验证不起作用 - Spring 安全

标签 java spring authentication spring-security

当用户在一个网站(站点 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;
}

AuthenticationUserDetailsS​​ervice

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/

相关文章:

java - 将自定义 AuthenticationProcessingFilter 与 <form-login> 结合使用(自动配置 ="true")

java - 改造方法响应重用到另一个 Activity 中

java - 在存储库中返回空点异常 - Spring Boot

spring jndi数据源设置

spring - Hibernate 3.6 动态方言解析器

asp.net - 使用 GraphServiceClient 检索 Azure Ad 成员的组信息

Linux命令检索用户当周登录次数

java - 调试递归函数

java - 转换为PDF/A并检查Linux下的合规性

java - 如何在java中滚动浏览mysql数据库