Spring boot+Spring security5+Thymeleaf集成项目登陆后一直处于匿名用户和defaultSuccessUrl无效问题的分析解决

一、前言

    前两天帮同事解决代码bug发现的问题,当天没有解决,把涉及到的代码抽出来单独放在一个项目里研究。当时在网上并没有合适的解决方案,经过不断调试,现在解决了问题,把问题处理方案贴出来供大家学习。

二、问题描述与解决

    点击登录后,后台service重写的loadUserByUsername方法显示已经根据提交的表单信息成功找到了对应的用户信息以及用户所对应的角色信息。代码如下,日志显示已经找到对应的用户信息。

    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
		SignUserEntity user = signDao.findByUserName(userName);
        if (user == null) {
            throw new UsernameNotFoundException("用户名不存在!!!");
        }
        System.out.println(user.toString());
        return user;
    }

    页面反应,页面在登录后并没有直接跳转到设置的的默认登录页面。而是在页面直接打印如下信息

               Spring boot+Spring security5+Thymeleaf集成项目登陆后一直处于匿名用户和defaultSuccessUrl无效问题的分析解决_第1张图片

    这个问题最简单的解决办法就是把你的defaultSuccessUrl换成successForwardUrl。就是说交给后台去跳转。比如原来是,defaultSuccessUrl("/welcome"),现在改成successForwardUrl("/welcome"),你要在后台写一个requestMapping是welcome的方法,这个方法最终通过return "user/loginsuccess";跳转到你要跳转的登录成功的页面loginsuccess.html。当然,你可以在这个方法里干点你想要的逻辑代码。

    注意,如果你设置了loginProcessingUrl,并在设置的方法中手动调用了loadUserByUsername方法,那么由于没有经过security拦截器链的流程,他的权限会一直处于空的状态,默认为匿名状态,可以去看下官方文档其过滤器链的解释。这种情况你需要删了loginProcessingUrl设置,然后把defaultSuccessUrl改为successForwardUrl,在successForwardUrl所指向的后台方法中写自己想要的登录成功的逻辑。注意,这个时候你的后台login方法(其他请求方法没关系)只有一个get请求方式的,即security5默认调用的权限认证方法。POST请求方式的login方法有的话一并删掉,逻辑放入successForwardUrl所指向的后台方法中。

    在实际的应用实践中,发现登录后权限并没有放入session中,而是在SecurityContextHolder.getContext().getAuthentication()中。注意,如果你的SecurityContextHolder.getContext().getAuthentication()为null或者匿名,就按照上述方法重新设置。所以后台获取用户信息就得通过SecurityContextHolder.getContext().getAuthentication()去获取了。我见网上有说通过request.getSession().getAttribute("SPRING_SECURITY_CONTEXT")获取用户信息的,经过实际验证,此值为null,当然,可能是我学艺不精。

三、注意事项及说明

    本文中如有错误烦请留言,谢谢各位大佬。如果有不懂的也可以留言。

你可能感兴趣的:(Springboot,spring,security)