登录成功后访问登录页面时出现Spring安全访问被拒绝消息。它应该重定向到默认页面

Posted

技术标签:

【中文标题】登录成功后访问登录页面时出现Spring安全访问被拒绝消息。它应该重定向到默认页面【英文标题】:Spring security access denied message when accessing login page after login successfully.It should redirect to default page 【发布时间】:2014-02-25 01:26:25 【问题描述】:
    成功配置spring security 身份验证正常工作 问题是,如果用户访问登录页面,登录成功后,会出现拒绝访问消息。它必须重定向到默认页面,因为用户已经登录。 当我登录成功后访问 login.html 时,出现访问被拒绝消息。 这是我的代码

<http auto-config="true">
    <intercept-url pattern="/login.html" access="ROLE_ANONYMOUS" />
    <intercept-url pattern="/services/**" filters="none"/>
    <intercept-url pattern="/**" access="ROLE_ADMIN" />
    <form-login login-page="/login.html" default-target-url="/stations.html" always-use-default-target="true" />
    <logout logout-url="/logout" logout-success-url="/login.html"/>
    <intercept-url pattern="/css/**" filters="none"/>
    <intercept-url pattern="/js/**" filters="none"/>
    <intercept-url pattern="/images/**" filters="none"/>
    <intercept-url pattern="/common/**" filters="none"/>
    </http>
    <authentication-manager>
    <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource"
       users-by-username-query="
          SELECT USERNAME,PASSWORD,USER_STATUS as ENABLED 
          from USERS where USERNAME=?" 

       authorities-by-username-query="
          SELECT USERNAME, USER_ROLE from USERS 
          where USERNAME =?  " 

    /> 
  </authentication-provider>
</authentication-manager> 

【问题讨论】:

【参考方案1】:

当用户成功登录时,这意味着他/她具有某些角色(例如管理员)。这与 ROLE_ANONYMOUS 不同。你可以试试:

<intercept-url pattern="/login.html" access="ROLE_ANONYMOUS, ROLE_ADMIN,..any other role" />

甚至更好

<intercept-url pattern="/login.html" filters="none" />

一个建议:Spring Security 按照您在 xml 中编写它们的顺序评估拦截 url 元素,因此您应该将最“贪婪”的拦截 url 放在最后。例如。 &lt;intercept-url pattern="/**" access="ROLE_ADMIN" /&gt; 会抓住一切。永远无法到达 css、js... 的拦截 URL。你应该把它们放在第一位。

【讨论】:

感谢4您的帮助和建议。但我的问题没有解决。我的问题是当已经登录用户访问登录页面时,它必须重定向到stations.html页面。在xml中可能吗?或者我需要这样写代码 4。 我不认为你可以用 xml 做到这一点。在映射到登录页面的控制器方法中,您可以检查当前用户 User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();并在需要时重定向。 我只使用与登录表单页面相关的intercept-url 标记而不是filters="none" 的属性access="permitAll"。实际上,最近的 Spring Security 版本不再支持 filters="none":建议的等效解决方案是使用另一个 http 元素和 security="none",但这不是您想要的,因为使用它您无法区分经过身份验证的访问从非认证访问到登录页面。【参考方案2】:

我也面临同样的问题,

我已经搜索了很多资源,但没有找到我要找的东西。

最后,我正在这样做:

public class SSOInit extends HandlerInterceptorAdapter 

    private static final Logger logger = Logger.getLogger(SSOInit.class.getName());

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 
        logger.info("### SSO : doInit, read page");
        logger.info("### SSO : request url = " + request.getRequestURL());
        logger.info("### SSO : request method = " + request.getMethod());

        CredentialVO credential = SSOService.getUserCredential();
        if (credential != null) 
            logger.info("### SSO : credential found, do check point");
            String status = SSOService.checkSSOSessionKey();
            if (status == null || status.equals("T")) 
                logger.info("### SSO : Check point didn't passed, redirect");
                Authentication auth = SecurityContextHolder.getContext().getAuthentication();
                if (auth != null) 
                    new SecurityContextLogoutHandler().logout(request, response, auth);
                
                SecurityContextHolder.getContext().setAuthentication(null);
             else 
                logger.info("### SSO : Check point passed");
                if (request.getServletPath().equals(SSOConstant.getREDIRECT_URL())) 
                    logger.info("### SSO : Check point passed, user trying access login form but already authenticated, redirect");
                    response.sendRedirect(request.getContextPath() + SSOConstant.getMAIN_URL());
                    return false;
                
            
        
        return super.preHandle(request, response, handler);
    

并将这个 xml 配置添加到 dispatcher-servlet.xml

<mvc:interceptors>
    <bean class="ptpn4.rawi.sso.client.authentication.SSOInit" />
</mvc:interceptors> 

在 SSOInit 类中,我对数据库进行了一些检查,我正在尝试构建自定义 SSO 解决方案。

我希望我目前的方法有另一个更好的解决方案。

【讨论】:

以上是关于登录成功后访问登录页面时出现Spring安全访问被拒绝消息。它应该重定向到默认页面的主要内容,如果未能解决你的问题,请参考以下文章

Spring安全登录错误页面,访问被拒绝

Spring Boot 安全性:在 Angular 8 中显示登录页面时出现问题

jsf spring安全访问被拒绝认证登录

Spring Social - facebook登录时出现404错误

spring mvc怎么加入权限控制,在未登录前,任何访问url都跳转到login页面;登录成功

尝试使用 express-jwt 阻止访问除登录页面以外的 Angular 应用程序时出现问题