小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来!
小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么好事都想着他,这不,我就安排了一个整合SpringSecurity+JWT实现登录认证的小任务交,没想到,他仅用四步就搞定了,这让我感觉倍有面。
一、关于 SpringSecurity
在 Spring Boot 出现之前,SpringSecurity 的使用场景是被另外一个安全管理框架 Shiro 牢牢霸占的,因为相对于 SpringSecurity 来说,SSM 中整合 Shiro 更加轻量级。Spring Boot 出现后,使这一情况情况大有改观。正应了那句古话:一人得道鸡犬升天,虽然有点不大合适,就将就着用吧。
这是因为 Spring Boot 为 SpringSecurity 提供了自动化配置,大大降低了 SpringSecurity 的学习成本。另外,SpringSecurity 的功能也比 Shiro 更加强大。
二、关于 JWT
JWT,是目前最流行的一个跨域认证解决方案:客户端发起用户登录请求,服务器端接收并认证成功后,生成一个 JSON 对象(如下所示),然后将其返回给客户端。
从本质上来说,JWT 就像是一种生成加密用户身份信息的 Token,更安全也更灵活。
三、整合步骤
第一步,给需要登录认证的模块添加 codingmore-security 依赖:
<dependency>
<groupId>top.codingmore</groupId>
<artifactId>codingmore-security</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
复制代码
比如说 codingmore-admin 后端管理模块需要登录认证,就在 codingmore-admin/pom.xml 文件中添加 codingmore-security 依赖。
第二步,在需要登录认证的模块里添加 CodingmoreSecurityConfig 类,继承自 codingmore-security 模块中的 SecurityConfig 类。
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class CodingmoreSecurityConfig extends SecurityConfig {
@Autowired
private IUsersService usersService;
@Bean
public UserDetailsService userDetailsService() {
//获取登录用户信息
return username -> usersService.loadUserByUsername(username);
}
}
复制代码
UserDetailsService 这个类主要是用来加载用户信息的,包括用户名、密码、权限、角色集合....其中有一个方法如下:
UserDetails loadUserByUsername(String username) throws Usernam