springboot实现简单的单点登录
思路
- 用户登录去校验用户信息,校验成功后将登录后的信息持久化,并返回一个系统可识别的信息串
- 用户每次访问接口将参数和信息串一起访问,然后通过拦截进行对信息串统一识别认证
实践
用户登录
通过用户名和密码验证是否登录成功,我这里是用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));}
@Overridepublic UserVO login(String username, String password) {User user = new User() ;user.setUsername(username);user.setPassword(password);QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(user);User users = this.getOne(userQueryWrapper);if(users == null ){throw new BusinessException("用户名或者密码错误");}//生成accessTokenString token = tokenService.createToken(users.getId());users.setAccessToken(token);//登录成功后返回用户信息和accessTokenreturn users.of();}
accessToken拦截和验证
accessToken拦截是通过拦截器进行拦截,其中包括哪些接口需要拦截,这里也会用到自定义注解,识别和使用,其次也会增加一些拦截器。
1.创建拦截器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic 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*/@Overridepublic 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;//拦截所有的请求方法,是否需要登录AuthLogin authLoginMethod = handlerMethod.getMethod().getAnnotation(AuthLogin.class);if(authLoginMethod != null && !authLoginMethod.needLogin()){return true;}//拦截整个模块,是否需要登录AuthLogin authLoginClass = handlerMethod.getBeanType().getAnnotation(AuthLogin.class);if(authLoginClass != null && !authLoginClass.needLogin()){return true;}//验证token信息this.validAuth();}return true;}/*** 验证token信息*/private void validAuth(){String token = RequestUtil.getToken();TokenService tokenService = SpringUtil.getBean(TokenService.class);//验证token是否符合条件tokenService.validateToken(token);}
}
4.验证token
@Overridepublic UserVO validateToken(String accessToken) {//通过解析tokenUserVO user = getUser(accessToken);//更新用户当前的最新信息User updateUser = new User();updateUser.setId(user.getId());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信息UserVO 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 BusinessException(Login.getCode(),NotLogin.getCode(),NotLogin.getMsg());}boolean keyExists = redisService.isKeyExists(AccessToken.getKey(), accessToken);if(!keyExists) {throw new BusinessException(Login.getCode(),TokenLose.getCode(), TokenLose.getMsg());}return true;}
我这里是用的base64加密用户信息
/*** 解密用户信息* @param accessToken* @return*/public UserVO decodeUser(String accessToken){String userString= (String) redisService.get(AccessToken.getKey(), 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>
<!-- https://mvnrepository.com/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>
springboot实现简单的单点登录相关推荐
- springboot redis shiro 实现 单点登录
大家好,我是烤鸭: 今天给大家分享简单的单点登录的实现方式. 环境及jar包: springboot 1.5.10 redis 2.9.0 (可以用tomcat的session,但 ...
- PHP简单实现单点登录功能示例
1.准备两个虚拟域名 127.0.0.1 www.openpoor.com 127.0.0.1 www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...
- CAS5.3服务器搭建及SpringBoot整合CAS实现单点登录
CAS5.3服务器搭建及SpringBoot整合CAS实现单点登录 1.1 什么是单点登录 1.2 什么是CAS 1.3 CAS服务端部署 1.template下载 1.4 客户端搭建 1.1 什么是 ...
- php 单点登录实现代码,PHP简单实现单点登录功能示例
1.准备两个虚拟域名 127.0.0.1 www.openpoor.com 127.0.0.1 www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...
- SpringBoot+OAuth2+JWT实现单点登录SSO完整教程,竟如此简单优雅!
作者:狂乱的贵公子 来源:https://www.cnblogs.com/cjsblog/p/10548022.html 1.前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题, ...
- Java实现简单的单点登录
摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...
- 单点登录原理和java实现简单的单点登录
摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...
- JavaWeb简单的单点登录、验证码校验功能实现
前言 最近项目刚刚告一段落,后期有时间会慢慢分解整理出来给大家分享.本文主要提供思路和核心代码,建立在有一定后台基础读者上.(相信没有基础的同学只要认真细读也是可以理解的) 技术原理 1.单点登录(S ...
- springboot+shiro+cas实现单点登录之shiro端搭建
github:https://github.com/peterowang/shiro-cas 本文如有配置问题,请查看之前的springboot集成shiro的文章 1.配置ehcache缓存,在re ...
- SpringBoot整合Keycloak实现单点登录
Keycloak是一个开源的身份和权限访问管理工具,轻松为应用程序和安全服务添加身份验证,无需处理储存用户或者验证用户,其提供用户联合.强健的身份验证.用户管理和细粒度授权等功能. 1. 搭建Keyc ...
最新文章
- Hyper-V 2016 系列教程25 配置NFS 存储服务器
- iOS 9应用开发教程之使用代码添加按钮美化按钮
- html跳转过度,jq实现锚点跳转过度
- cxGrid导出Excel货币符号问题
- 万能的Entry,两个变量的Model/JavaBean再也不用写了!
- 1.13 实例:用户修改密码
- 13.transform确保目标空间足够大
- C#进阶系列——WebApi 异常处理解决方案
- 家里在一二线城市有很多套房是什么体验?答案太颠覆!
- java学习中,instanceof 关键字 和 final 关键字、值的传递(java 学习中的小记录)...
- 各国“未雨绸缪”致网络安全陷入困境 安全防御诱发“防御性入侵”
- 如何打开.pos文件
- 没有苹果开发账号,只有p12文件和mobileprovision文件进行打包
- web 上传文件到ftp服务器,web 上传文件到ftp服务器上
- TP6 接口返回三要素
- 手把手教你如何PCB板材选型(一)
- 计算机的正确配置文件,显示器颜色配置文件在win10电脑中设置正确配置的方法...
- 通俗易懂的磁盘分区教程,图文并茂简单明了!
- 如何撰写综述性科技论文(网摘)
- 解读即将施行的《网络安全审查办法》,开发者需要注意的
热门文章
- pcsx2 linux双显卡,PC模拟PS2游戏模拟器PCSX2使用教程
- 将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值。
- echart 最小值_EchartJS平均线、最大值、最小值
- SpringMVC工作原理与工作流程
- php hprose扩展1.5.5,基于Hprose for PHP 1.5.6、Yii2.0.7的RPC的基本实现流程
- 项目总结—jQuery EasyUI-DataGrid 拼表及查看详情
- 三分钟明白 Activity工作流 -- java运用
- linux mp4box安装,视频处理利器 MP4Box常用的12个命令
- python递归汉诺塔详解_Python实现汉诺塔递归算法
- 如何用keil5打开keil4工程