Spring boot 入门教程-token验证

// 判断是否存在令牌信息,如果存在,则允许登录

String accessToken = request.getHeader(“Authorization”);

if (null == accessToken) {

throw new CommonException(401, “无token,请重新登录”);

} else {

// 从Redis 中查看 token 是否过期

Claims claims;

try{

claims = TokenUtils.parseJWT(accessToken);

}catch (ExpiredJwtException e){

response.setStatus(401);

throw new CommonException(401, “token失效,请重新登录”);

}catch (SignatureException se){

response.setStatus(401);

throw new CommonException(401, “token令牌错误”);

}

String userName = claims.getId();

UserBase user = userBaseService.findUserByAccount(userName);

if (user == null) {

response.setStatus(401);

throw new CommonException(401, “用户不存在,请重新登录”);

}

// 当前登录用户@CurrentUser

request.setAttribute(CurrentUserConstants.CURRENT_USER, user);

return true;

}

} else {//不需要登录可请求

return true;

}

}

// 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)

@Override

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

// 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)

@Override

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}

}

/**

  • @BelongsProject:

  • @BelongsPackage: com.jdtaste.jdtastesso.web.intercepter.auth

  • @Author:

  • @CreateTime: 2018-07-04 15:45

  • @Description: 当前用户

*/

public class CurrentUserConstants {

/**

  • 当前用户参数名

*/

public final static String CURRENT_USER = “CurrentUser”;

}

6.自定义参数解析器

/**

  • @BelongsPackage: com.jdtaste.jdtastesso.web.intercepter.auth

  • @Author:

  • @CreateTime: 2018-07-04 15:42

  • @Description: 自定义参数解析器

  • 增加方法注入,将含有 @CurrentUser 注解的方法参数注入当前登录用户

*/

public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {

/*

  • supportsParameter:用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument。

*resolveArgument:真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象。

  • */

@Override

public boolean supportsParameter(MethodParameter parameter) {

System.out.println(“----------supportsParameter-----------” + parameter.getParameterType());

return parameter.getParameterType().isAssignableFrom(UserBase.class)//判断是否能转成UserBase 类型

&& parameter.hasParameterAnnotation(CurrentUser.class);//是否有CurrentUser注解

}

@Override

public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,

NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

System.out.println(“--------------resolveArgument-------------” + parameter);

UserBase user = (UserBase) webRequest.getAttribute(CurrentUserConstants.CURRENT_USER, RequestAttributes.SCOPE_REQUEST);

if (user != null) {

return user;

}

throw new MissingServletRequestPartException(CurrentUserConstants.CURRENT_USER);

}

}

7.将拦截器和参数解析器加入容器

/**

  • @BelongsProject:

  • @BelongsPackage: com.jdtaste.jdtastesso.conf

  • @Author:

  • @CreateTime: 2018-07-04 10:03

  • @Description: 配置URLInterceptor拦截器,以及拦截路径

*/

@EnableWebMvc

@Configuration

public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {

@Override

public void addInterceptors(InterceptorRegistry registry) {

// addPathPatterns 用于添加拦截规则

// excludePathPatterns 用户排除拦截

registry.addInterceptor(authenticationInterceptor())

.addPathPatterns(“//”);

super.addInterceptors(registry);

}

@Override

public void addArgumentResolvers(List argumentResolvers) {

argumentResolvers.add(currentUserMethodArgumentResolver());

super.addArgumentResolvers(argumentResolvers);

}

@Bean

public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {

return new CurrentUserMethodArgumentResolver();

}

/**

  • 解决 拦截器中注入bean 失败情况出现

  • addArgumentResolvers方法中 添加

  • argumentResolvers.add(currentUserMethodArgumentResolver());

*/

@Bean

public AuthenticationInterceptor authenticationInterceptor() {

return new AuthenticationInterceptor();

}

}

argumentResolvers.add(currentUserMethodArgumentResolver());

super.addArgumentResolvers(argumentResolvers);

}

@Bean

public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {

return new CurrentUserMethodArgumentResolver();

}

/**

  • 解决 拦截器中注入bean 失败情况出现

  • addArgumentResolvers方法中 添加

  • argumentResolvers.add(currentUserMethodArgumentResolver());

*/

@Bean

public AuthenticationInterceptor authenticationInterceptor() {

return new AuthenticationInterceptor();

}

}

8.Controller

@LoginRequired

@RequestMapping(value = “/token”)

public String token(@CurrentUser UserBase userBase,String account,String token) {

log.info(account+“----”+token);

log.info(“----”+userBase.getAccount());

log.info(“params==” + userBase.toString());

if (userBaseService.findUserByAccount(userBase.getAccount()) == null) {

return “账号不存在”;

} else {

UserBase result = null;

result = userBaseService.login(userBase);

//生成token

//String accessToken=TokenUtils.createJwtToken(userBase.getAccount());

if (result == null) {

return “密码错误”;

} else {

return “SUCCESS”;

}

}

}

@LoginRequired

@RequestMapping(value = “/token”)

public String token(@CurrentUser UserBase userBase,String account,String token) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?

掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
nity.csdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

最后

面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?

掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。

[外链图片转存中…(img-wnJ3up3O-1711814605515)]

[外链图片转存中…(img-cao3MPS4-1711814605515)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
集成 sa-token 可以让 Spring Boot 应用快速实现权限认证、RBAC、SSO、踢人下线等功能。下面是集成的步骤: 1. 引入 sa-token 的依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>cn.dev33.satoken</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.22.1-RELEASE</version> </dependency> ``` 2. 配置 sa-token 在 application.properties 或 application.yml 文件中添加以下配置: ```yaml # sa-token 配置 sa-token: # token 持久化类型:0-内存版、1-redis版、2-mongodb版、3-jwt版 store-type: 1 # redis 配置 redis: mode: standalone host: 127.0.0.1 port: 6379 database: 0 timeout: 0 # 其他配置... ``` 其中,store-type 表示 sa-token 的持久化类型,可以选择内存版、redis版、mongodb版或 jwt 版。此处选择了 redis 版。 3. 开启 sa-tokenSpring Boot 应用启动类上加上 @SaTokenApplication 注解即可开启 sa-token 的功能: ```java @SpringBootApplication @SaTokenApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 4. 使用 sa-token 现在,我们可以在代码中使用 sa-token 提供的 API 来实现权限认证、RBAC、SSO、踢人下线等功能了。比如: ```java @RestController public class MyController { // 登录接口 @PostMapping("/login") public String login(String account, String password) { // 模拟登录 if ("admin".equals(account) && "123456".equals(password)) { // 登录成功,生成token String token = SaTokenManager.createToken(account); // 返回token return token; } else { // 登录失败 return "账号或密码错误"; } } // 需要登录才能访问的接口 @GetMapping("/user") public String user() { // 获取当前登录账号 String account = SaTokenManager.getAccount(); // 返回当前登录账号 return "当前登录账号:" + account; } // 需要权限才能访问的接口 @GetMapping("/admin") public String admin() { // 检查是否具有admin角色 boolean isAdmin = SaTokenManager.hasRole("admin"); if (isAdmin) { return "欢迎管理员访问"; } else { return "没有访问权限"; } } // 注销登录接口 @PostMapping("/logout") public String logout() { // 注销登录 SaTokenManager.logout(); return "注销成功"; } } ``` 以上是使用 sa-token 的基本示例,你可以根据自己的需求,使用 sa-token 提供的更多 API 实现更复杂的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值