思路

  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));}
@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实现简单的单点登录相关推荐

  1. springboot redis shiro 实现 单点登录

    大家好,我是烤鸭: 今天给大家分享简单的单点登录的实现方式. 环境及jar包: springboot     1.5.10 redis    2.9.0    (可以用tomcat的session,但 ...

  2. PHP简单实现单点登录功能示例

    1.准备两个虚拟域名 127.0.0.1  www.openpoor.com 127.0.0.1  www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...

  3. CAS5.3服务器搭建及SpringBoot整合CAS实现单点登录

    CAS5.3服务器搭建及SpringBoot整合CAS实现单点登录 1.1 什么是单点登录 1.2 什么是CAS 1.3 CAS服务端部署 1.template下载 1.4 客户端搭建 1.1 什么是 ...

  4. php 单点登录实现代码,PHP简单实现单点登录功能示例

    1.准备两个虚拟域名 127.0.0.1  www.openpoor.com 127.0.0.1  www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...

  5. SpringBoot+OAuth2+JWT实现单点登录SSO完整教程,竟如此简单优雅!

    作者:狂乱的贵公子 来源:https://www.cnblogs.com/cjsblog/p/10548022.html 1.前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题, ...

  6. Java实现简单的单点登录

    摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...

  7. 单点登录原理和java实现简单的单点登录

    摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...

  8. JavaWeb简单的单点登录、验证码校验功能实现

    前言 最近项目刚刚告一段落,后期有时间会慢慢分解整理出来给大家分享.本文主要提供思路和核心代码,建立在有一定后台基础读者上.(相信没有基础的同学只要认真细读也是可以理解的) 技术原理 1.单点登录(S ...

  9. springboot+shiro+cas实现单点登录之shiro端搭建

    github:https://github.com/peterowang/shiro-cas 本文如有配置问题,请查看之前的springboot集成shiro的文章 1.配置ehcache缓存,在re ...

  10. SpringBoot整合Keycloak实现单点登录

    Keycloak是一个开源的身份和权限访问管理工具,轻松为应用程序和安全服务添加身份验证,无需处理储存用户或者验证用户,其提供用户联合.强健的身份验证.用户管理和细粒度授权等功能. 1. 搭建Keyc ...

最新文章

  1. Hyper-V 2016 系列教程25 配置NFS 存储服务器
  2. iOS 9应用开发教程之使用代码添加按钮美化按钮
  3. html跳转过度,jq实现锚点跳转过度
  4. cxGrid导出Excel货币符号问题
  5. 万能的Entry,两个变量的Model/JavaBean再也不用写了!
  6. 1.13 实例:用户修改密码
  7. 13.transform确保目标空间足够大
  8. C#进阶系列——WebApi 异常处理解决方案
  9. 家里在一二线城市有很多套房是什么体验?答案太颠覆!
  10. java学习中,instanceof 关键字 和 final 关键字、值的传递(java 学习中的小记录)...
  11. 各国“未雨绸缪”致网络安全陷入困境 安全防御诱发“防御性入侵”
  12. 如何打开.pos文件
  13. 没有苹果开发账号,只有p12文件和mobileprovision文件进行打包
  14. web 上传文件到ftp服务器,web 上传文件到ftp服务器上
  15. TP6 接口返回三要素
  16. 手把手教你如何PCB板材选型(一)
  17. 计算机的正确配置文件,显示器颜色配置文件在win10电脑中设置正确配置的方法...
  18. 通俗易懂的磁盘分区教程,图文并茂简单明了!
  19. 如何撰写综述性科技论文(网摘)
  20. 解读即将施行的《网络安全审查办法》,开发者需要注意的

热门文章

  1. pcsx2 linux双显卡,PC模拟PS2游戏模拟器PCSX2使用教程
  2. 将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值。
  3. echart 最小值_EchartJS平均线、最大值、最小值
  4. SpringMVC工作原理与工作流程
  5. php hprose扩展1.5.5,基于Hprose for PHP 1.5.6、Yii2.0.7的RPC的基本实现流程
  6. 项目总结—jQuery EasyUI-DataGrid 拼表及查看详情
  7. 三分钟明白 Activity工作流 -- java运用
  8. linux mp4box安装,视频处理利器 MP4Box常用的12个命令
  9. python递归汉诺塔详解_Python实现汉诺塔递归算法
  10. 如何用keil5打开keil4工程