当前位置: 首页 > 知识库问答 >
问题:

将Spring security 3.0升级到Spring security 3.1时Spring security不工作

傅明知
2023-03-14

我已经成功地将spring security 3.0集成到web应用程序中,并且运行良好,现在我要将spring security 3.0升级到3.1,我的CustomAuthenticationManager遇到问题,每当我尝试登录时,CustomAuthenticationManager都会被呼叫两次。所以,在第一次用户身份验证成功并返回usernamePasswordAuthenticationToken,但这个类再次被调用,这次主体返回正确的值,但凭据返回null,因此用户身份验证失败,并再次重定向到登录页面,这就是为什么我永远无法登录。

CustomAuthenticationManager:

public class CustomAuthenticationProvider implements AuthenticationProvider {
    @Autowired
    private ILoginService loginService;
    public Authentication authenticate(Authentication authentication)
            throws AuthenticationException {
        UsernamePasswordAuthenticationToken usernamePassswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
                authentication.getPrincipal(), authentication.getCredentials());
        if (loginService.authenticateUser((String) authentication.getPrincipal())) {
            if (loginService.validateUserIdAndPass((String) authentication.getPrincipal(), (String) authentication.getCredentials())) {
                usernamePassswordAuthenticationToken.setAuthenticated(false);
            } else
                throw new BadCredentialsException(
                        "Username/Password does not match");
        } else
            throw new BadCredentialsException(
                    "Username/Password does not match");
        return usernamePassswordAuthenticationToken;
    }
    public boolean supports(Class<? extends Object> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

我的应用程序ContextSecurity。xml:

<global-method-security pre-post-annotations="enabled">     
    </global-method-security>  
    <beans:bean id="myAccessDecisionManager"
        class="com.app.common.security.repository.MyAccessDecisionManager"> 
    </beans:bean> 

    <http auto-config="true" once-per-request="true"
        access-decision-manager-ref="myAccessDecisionManager" access-denied-page="/jsp/errorPage.jsp">

        <intercept-url pattern="/*.app"  access="ROLE_ANONYMOUS"/>  

         <form-login login-page="/login.app" login-processing-url="/j_spring_security_check"
            default-target-url="/login/validate.app"
            authentication-failure-url="/login.app?login_error=1" />
        <logout logout-url="/j_spring_security_logout"
            logout-success-url="/login.app" invalidate-session="true" /> 
        <session-management invalid-session-url="/login.app"
            session-fixation-protection="newSession">
            <concurrency-control max-sessions="100"
                error-if-maximum-exceeded="false" />
        </session-management>
    </http>

    <authentication-manager>
        <authentication-provider ref="customAuthenticationProvider"></authentication-provider>
    </authentication-manager>

    <beans:bean id="customAuthenticationProvider"
        class="com.app.common.security.repository.CustomAuthenticationProvider">        
    </beans:bean>

请告诉我哪里错了。

共有1个答案

汪翰墨
2023-03-14

自Spring 3.0.3(及更高版本)以来,默认的AuthenticationManagerProviderManager会在尝试验证后清除凭据(第1493节)。您必须是旧版本(Spring Security的3.0.3之前)的用户

您的CustomAuthenticationProvider也有缺陷,因为在成功的身份验证之后,您应该将authenticated设置为true(否则扩展AbstractSecurityInterceptor的拦截器将重新尝试身份验证)。

链接

  1. SEC-1493
  2. ProviderManager源代码
  3. AbstractSecurityInterceptor javadoc
 类似资料:
  • 我正在运行《docker compose》中的jenkins,来自图片jenkins/jenkins。升级到Jenkins 2.277.1后,LDAP身份验证停止工作,我无法登录。我收到以下错误: 詹金斯。docker。new\u 1 | 2021 06-04 14:49:31.3110000[id=138]警告o.j.p.p.DiskUsageCollector#collect:无法获取磁盘使用

  • 与pip一起运行命令会出现以下错误。甚至命令也会产生以下错误。 我读到这个错误是由setupols版本31.0.0引起的,它应该低于28.0.0。但是我的setupols的版本是26.1.1,它仍然给出了相同的错误。

  • 在我有时工作正常,但是当我升级它时,它停止了工作。 我安装的版本是,带有和。 Traceback(最近一次调用最后一次):文件"C:\用户\动画\AppData\本地\程序\Python\Python36\lib\site-包\tenorflow\python\pywrap_tensorflow.py",第58行,来自tensorflow.python.pywrap_tensorflow_inte

  • 我刚从以下位置升级了Gradle版本: 到 我的项目中的数据绑定已停止工作。我曾尝试重建项目,甚至尝试从项目中完全删除文件夹,但没有成功。Android Studio出现以下错误: 类型参数T的上限不兼容:ViewDataBinding和ActivityMainBinding 请看这个截图。 如果我降级到,一切正常。如何获取此错误的信息?

  • 我应该将我的项目log4j升级到log4j2。所以我删除了log4j依赖项并添加了log4j2。一些项目工作良好,但有一个项目出现错误,如下所示: 我使用了mvn dependency:tree命令,试图找到依赖项之间的冲突,并且试图排除可能相关的每个子库,但仍然得到相同的错误。 依赖项: log4j2.properties:

  • 问题内容: 我正在尝试将Eclipse环境更新为Java8。我安装了jdk和jre版本8。我也这样做: https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler 然后在项目中->属性-> Java构建路径-> JRE系统库->编辑->执行环境-> JavaSE-1.8(unbound),这是名称中唯一带有Java 8的选项。但是,