spring secutiry密码验证的另一种解决办法(荐)

最近在集成sping security 到spring boot中,看到大部分登陆验证的代码都这么写

@Service
public class CustomUserService implements UserDetailsService { //自定义UserDetailsService 接口

    @Autowired
    UserDao userDao;
    @Autowired
    PermissionDao permissionDao;

    public UserDetails loadUserByUsername(String username) {
        SysUser user = userDao.findByUserName(username);
        if (user != null) {
            List<Permission> permissions = permissionDao.findByAdminUserId(user.getId());
            List<GrantedAuthority> grantedAuthorities = new ArrayList <>();
            for (Permission permission : permissions) {
                if (permission != null && permission.getName()!=null) {

                GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(permission.getName());
                grantedAuthorities.add(grantedAuthority);
                }
            }
            return new User(user.getUsername(), user.getPassword(), grantedAuthorities);
        } else {
            throw new UsernameNotFoundException("admin: " + username + " do not exist!");
        }
    }

}

然后配置那时的代码为:

 @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(urlUserService).passwordEncoder(new PasswordEncoder() {

            @Override
            public String encode(CharSequence rawPassword) {
                return MD5Util.encode((String) rawPassword);
            }

            @Override
            public boolean matches(CharSequence rawPassword, String encodedPassword) {
                return encodedPassword.equals(MD5Util.encode((String) rawPassword));
            }
        });
    }

看到以上代码,我就有个疑问了。 loadUserByUsername是为什么要把用户的权限也获取了呢,如果密码不正确,那获取的权限也没有用,浪费性能。 个人调试了一下代码,发现登陆验证时,确实会调用到loadUserByUsername。 那怎么办呢?如何解决。 经查,解决办法如下; 1.不使用UserDetailsService,改为使用AbstractUserDetailsAuthenticationProvider 示例代码如下:

public class MucAppAuthenticationProvider extends
        AbstractUserDetailsAuthenticationProvider {
    private static Logger logger = LoggerFactory.getLogger(AbstractUserDetailsAuthenticationProvider.class);

    @Autowired
    SecurityUserService securityUserService;

    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails,
                                                  UsernamePasswordAuthenticationToken authentication)
            throws AuthenticationException {
        //如果想做点额外的检查,可以在这个方法里处理,校验不通时,直接抛异常即可
    }

    @Override
    protected UserDetails retrieveUser(String username,
                                       UsernamePasswordAuthenticationToken authentication)
            throws AuthenticationException {
        //获取用户权限或密码校验
        return loadUserDetail(username);
    }

    
    
}

2.配置WebSecurityConfigurer改为如下:

@Bean
    AppAuthenticationProvider appAuthenticationProvider() { // 注册UserDetailsService 的bean
        return new AppAuthenticationProvider();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
         auth.authenticationProvider(appAuthenticationProvider());
    }

经测试,登陆验证没有发现任何问题

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

velocity模板引擎学习(2)-velocity tools 2.0

使用velocity后,原来的很多标签无法使用了,必须借助velocity tools来完成,目前velocity tools最新版本是2.0,下面是veloc...

48790
来自专栏JavaEdge

Spring Security源码分析之SecurityContextPersistenceFilter

29080
来自专栏码匠的流水账

聊聊spring security oauth2的password方式的认证

本文主要来聊聊spring security oauth2的password方式的认证

33620
来自专栏Netkiller

Spring boot 2.0 with Oauth2 + Jwt

中国广东省深圳市宝安区龙华镇溪山美地 518109 +86 13113668890 +86 755 29812080 <>

1.3K00
来自专栏咖啡的代码人生

java web Servlet 使用 Application/ServletContext

本文介绍 怎么在Servlet Web应用 中 初始化 全局变量(ServletContext) ServletContext 也就是 java Serv...

40850
来自专栏Spring相关

SpringSecurity自定义用户登录

根据上一节的配置,默认在服务开启的时候会被要求自动的进行表单登陆。用到的用户名只能是一个固定的用户名user,它的密码是每次启动的时候服务器自动生成的。最常见的...

1.6K30
来自专栏ytkah

DedeCMS后台500错误一种原因是不支持PHP5.3、5.4及以上版本

  我们在迁移网站的时候,可能会出现DedeCMS后台500错误,有可能是因为dedecms不支持PHP5.3、5.4及以上版本,这时我们要改动一些设置才能修复...

34430
来自专栏JavaEdge

Spring Security权限框架理论与实战(二)-常用权限拦截器1 SecurityContextPersistenceFilter

通过观察Filter的名字,就能大概猜出来这个过滤器的作用,持久化SecurityContext实例 org.springframework.security...

20820
来自专栏史上最简单的Spring Cloud教程

web的监听器,你需要知道这些...

一、简介 Listener是Servlet规范的另一个高级特性,它用于监听java web程序的事件,例如创建、修改、删除session,request,con...

21350
来自专栏码匠的流水账

spring security ajax登录及返回

本文讲述一下如何自定义spring security的登录页,网上给的资料大多过时,而且是基于后端模板技术的,讲的不是太清晰,本文给出一个采用ajax的登录及返...

27220

扫码关注云+社区

领取腾讯云代金券