springboot实现简单的单点登录
思路
1. ⽤户登录去校验⽤户信息,校验成功后将登录后的信息持久化,并返回⼀个系统可识别的信息串
2. ⽤户每次访问接⼝将参数和信息串⼀起访问,然后通过拦截进⾏对信息串统⼀识别认证
实践
⽤户登录
通过⽤户名和密码验证是否登录成功,我这⾥是⽤accessToken作为系统可识别的信息串,持久化你可以存⼊数据库,也可以放在redis,但是经常要验证accessToken,建议放在redis中好⼀点。
@ApiOperation("登录")
@PostMapping("login")
@AuthLogin(needLogin = false)
public RestResponse<User> login(String username,String password){
return RestResponse.ok(userService.login(username,password));
}
@Override
public UserVO login(String username, String password) {
User user = new User() ;
user.setUsername(username);
user.setPassword(password);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(user);
User users = One(userQueryWrapper);
if(users == null ){
throw new BusinessException("⽤户名或者密码错误");
}
//⽣成accessToken
String token = Id());
users.setAccessToken(token);
//登录成功后返回⽤户信息和accessToken
return users.of();
}
accessToken拦截和验证
accessToken拦截是通过进⾏拦截,其中包括哪些接⼝需要拦截,这⾥也会⽤到⾃定义注解,识别和使⽤,其次也会增加⼀些。
1.创建
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//全局登录拦截请求
registry.addInterceptor(new AuthLoginIntercept()).addPathPatterns("/**")
.excludePathPatterns("/file/**")
.excludePathPatterns("/login/**")
.excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**") .excludePathPatterns("/druid/**");
}
/**
* 上传⽂件外部访问拦截
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/file/**")
.addResourceLocations("file:"+BaseUploadPath);
}
}
2.⾃定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE,ElementType.METHOD})
@Documented
@Inherited
public @interface AuthLogin {
/**
*是否需要登录
* 默认:需要登录
*/
boolean needLogin() default true ;
}
3.实现⽅法
@Service
public class AuthLoginIntercept extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
//拦截所有的请求⽅法,是否需要登录
AuthLogin authLoginMethod = Method().getAnnotation(AuthLogin.class);
if(authLoginMethod != null && !dLogin()){
return true;
}
//拦截整个模块,是否需要登录
AuthLogin authLoginClass = BeanType().getAnnotation(AuthLogin.class);
if(authLoginClass != null && !dLogin()){
return true;
}
//验证token信息
this.validAuth();
}
return true;
}
/**
* 验证token信息
*/
private void validAuth(){
String token = Token();
TokenService tokenService = Bean(TokenService.class);
//验证token是否符合条件
tokenService.validateToken(token);
}
}
4.验证token
@Override
public UserVO validateToken(String accessToken) {
//通过解析token
UserVO user = getUser(accessToken);
//更新⽤户当前的最新信息
User updateUser = new User();
updateUser.Id());
updateUser.setLastLoginTime(new Date());
userService.update(updateUser);
return user;
}
通过token获取⽤户信息
/**
* 获取⽤户信息
* @param accessToken
* @return
* @throws BusinessException
*/
public UserVO getUser(String accessToken)throws BusinessException {
//验证token是否正确
boolean validToken = validToken(accessToken);
if(validToken){
//解密token信息
适合新手的spring bootUserVO user = decodeUser(accessToken);
validUser(user);
return user;
}
return null;
}
验证token的合法性
/**
* 校验token信息
* @param accessToken 认证
* @return
* @throws BusinessException
*/
public boolean validToken(String accessToken) throws BusinessException{
if(StrUtil.isBlank(accessToken)){
throw new Code(),Code(),Msg());
}
boolean keyExists = redisService.Key(), accessToken);
if(!keyExists) {
throw new Code(),Code(), Msg()); }
return true;
}
我这⾥是⽤的base64加密⽤户信息
/**
* 解密⽤户信息
* @param accessToken
* @return
*/
public UserVO decodeUser(String accessToken){
String userString= (String) (Key(), accessToken);
String userJson = Base64.decodeStr(userString);
return JSONObject.parseObject(userJson,UserVO.class);
}
maven Jar包依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 缓存依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<scope>compile</scope>
</dependency>
<!-- mvnrepository/artifact/com.alibaba/fastjson --> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论