当前位置: 首页 > news >正文

有框架有模板怎么做网站/百度品牌

有框架有模板怎么做网站,百度品牌,学做转手绘的网站,四川省建设厅注册管理中心网站首页Spring security 系列博客目录 Spring Security 入门 - 01 将 Spring security 引入到工程Spring security 入门 - 02 自定义用户登录页面和登录处理逻辑Spring security 入门 - 03 自定义登录成功后的处理逻辑Spring security 入门 - 04整合 jwt 对应源代码 Spring Securit…

Spring security 系列博客目录

  • Spring Security 入门 - 01 将 Spring security 引入到工程
  • Spring security 入门 - 02 自定义用户登录页面和登录处理逻辑
  • Spring security 入门 - 03 自定义登录成功后的处理逻辑
  • Spring security 入门 - 04整合 jwt

对应源代码

  • Spring Security 01- 将 Spring security 引入到工程
  • Spring security 02-自定义用户登录页面和登录处理逻辑
  • Spring security 03-自定义登录成功后的处理逻辑
  • Spring security 04-整合 jwt

预备知识

阅读本文之前,首先要了解 Spring security 的相关内容,最起码需要将我之前的系列文章看完。其次需要学习 jwt 的相关知识。关于 jwt(全称JSON Web Token) ,推荐参考阮一峰大神的 JSON Web Token 入门教程,也可翻看其他相关资料。

需求分析

业务需求:后台的一些接口需要用户登录(比如获取用户列表:user/list)时,才有权限访问。

业务实现:客户端访问 user/list 接口时,需要在请求头携带 token,然后后台通过判断 token 的有效性去选择放行还是拦截请求。

业务难点:token 的有效性如何判断?

难点攻破:token的有效性借助 jwt,所以需要充分理解 jwt 的相关知识。

业务流程:当访问 user/list 接口时,后台通过一个过滤器拦截,从请求头中获取token信息,然后通过 jwt工具类校验token的有效性。

创建工程

我自己是将上一篇文章中的工程复制了一份,然后做了些改动,这次改动的东西比较多(增加和删除了一些类,增加了一些配置),当然我会尽量讲清楚做了哪些改动,所以大家自行选择新建工程还是复制一份。

引入 pom 依赖

较之上一篇的内容,本次只新增了 jwt 的依赖包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--JWT(Json Web Token)-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version>
</dependency>

修改 springboot 的 yml 配置文件

这里可以简单看一下,根据 jwt 相关知识以及看后面的代码会明白他们的意义。

jwt:tokenHeader: Authorization # JWT存储的请求头secret: mySecret # JWT加解密使用的密钥expiration: 604800 # JWT的超期限时间(60*60*24)tokenHead: Bearer  # JWT负载中拿到开头

准备几个公共类

只是图个自己方便,从别处 copy 的工具类,需要大家简单看下。三个类合在一起的作用就是一个 json 格式的响应数据的工具。代码放在 common 包下面。

  • CommonResult 响应工具类, 返回 json 数据给客户端。例如:{code:200, message:“登录成功”,data:null}
  • IErrorCode 接口,定义了两个方法
  • ResultCode 枚举类 实现了 IErrorCode 接口,定义响应返回结果

封装一个 jwt 的工具类

从别处拷贝了一个 JwtTokenUtil 类,里面封装了一些方法,诸如:生成token,判断token的有效性等。不用纠结方法是如何实现的,只管拿来用(除非出现问题),方法见名知意。

定义登录接口

在 UserController 类里面定义一个登录方法,如下所示。

  • 需要调用UserDetailService 的loadUserByUsername方法,如果看过我之前的文章,这里应该清楚这个方法主要做用户校验的。

  • 调用 security 的 api, SecurityContextHolder.getContext().setAuthentication(authentication),可以理解为security认证用户登录成功

  • 生成 token 信息返回给客户端,这个 token 是供客户端调用其他接口(需要用户登录才能调用的接口)时使用的。

    /***  用户登录接口* @param username 用户名*  @param  password 密码* @return      * */
    @PostMapping("/login")
    public Object login(@RequestParam("username") String username, @RequestParam("password") String password) {try {// 校验用户信息 UserDetails userDetails = userDetailsService.loadUserByUsername(username);// 保存用户登录态UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authentication);// 进行到这一步,security 才会认为你登陆成功// 根据用户信息生成 token String token = jwtTokenUtil.generateToken(userDetails);return CommonResult.success(token);// 到这里, 从我们的业务角度来说登陆成功了} catch (AuthenticationException e) {System.out.println("登录异常: " + e.getMessage());return CommonResult.failed("登录失败");}
    

    }

定义一个过滤器

过滤器的功能就是用来拦截请求的 url ,然后校验 token 的有效性。
SecurityContextHolder.getContext().setAuthentication(authentication); 这段代码着重说一下,我们可以简单理解为 SecurityContextHolder.getContext() 为 Security 提供的一个保存已登录用户信息的一个容器,通过调用它的 setAuthentication 以及getAuthentication方法,可以将用户信息存入容器和从容器中取出。

/*** JWT登录授权过滤器*/
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate JwtTokenUtil jwtTokenUtil;@Value("${jwt.tokenHeader}")private String tokenHeader;@Value("${jwt.tokenHead}")private String tokenHead;@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws ServletException, IOException {// 1. 从请求头中取出 token ,key随便定义,我这里定义在了配置文件中String authHeader = request.getHeader(this.tokenHeader);// 2. 判断是否为空,以及是否以 "Bearer " 开头       ps :固定格式 if (authHeader != null && authHeader.startsWith(this.tokenHead)) {String authToken = authHeader.substring(this.tokenHead.length());// 必须以 "Bearer " 开头// 3. 从 token 里获取用户名String username = jwtTokenUtil.getUserNameFromToken(authToken);// 4. 只要 token 没过期,就让用户保持登录状态 jwt 令牌只是辅助登录, 真正是否登录要看 authentication 是否有效if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {// 下面这段代码就是为了让 security 保持用户登录状态, 在UserController 里你也可以看到UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);if (jwtTokenUtil.validateToken(authToken, userDetails)) {UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));// 核心代码SecurityContextHolder.getContext().setAuthentication(authentication);}}}chain.doFilter(request, response);}}

将 JwtFilter 添加到 Spring Security 中

在 WebSecurityConfig 配置类的configure方法中的最后一行加上如下代码。该方法中的其他代码的含义,不懂得可以参考前几篇博客。

@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().disable();// 必须有, 不然会 403 forbidden/*http.formLogin().loginPage("/loginPage.html")// 自定义登录页.loginProcessingUrl("/form/login")// 自定义登录 action, 名字随便起.successHandler(successHandler)// 自定义登录成功处理类.failureHandler(failureHandler);// 自定义登录失败处理类*/// 访问 "/form/login", "/loginPage.html"   放行http.authorizeRequests().antMatchers("/user/userInfo", "/user/login", "/form/login", "/loginPage.html").permitAll().antMatchers("/hello").hasRole("superadmin") // 只有superadmin 角色的用户才能访问.anyRequest().authenticated();/*http.exceptionHandling().accessDeniedHandler(accessDeniedHandler)// 用户没有访问权限处理器.authenticationEntryPoint(entryPoint);// 用户没有登录处理器*/// 这里是新增的代码http.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);
}

总结

至此,Sprng Securiy 系列博客更新完毕。这里可能需要声明一下, 我的一系列文章可能没讲 Spring Security 的工作流程,或者底层原理,全程在将如何使用 Spring Security。比如下面这段凭空而来的代码,只是讲了这段代码的逻辑含义,没有讲清楚为什么这样用。这些是我以后要努力完成的方向。只是希望帮助到需要的人,也欢迎大家给出意见和批评。

UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
if (jwtTokenUtil.validateToken(authToken, userDetails)) {UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));SecurityContextHolder.getContext().setAuthentication(authentication);
}
http://www.jmfq.cn/news/5175307.html

相关文章:

  • 佛山做外贸网站特色/适合网络营销的产品
  • 网站建设专业的公司排名/营销渠道模式有哪些
  • wordpress首页代码压缩/百度关键词优化查询
  • 网站销售策划/网络营销具有哪些特点
  • wordpress下一篇调用/百度推广优化怎么做
  • 有没有可以做游戏的网站吗/深圳市seo点击排名软件价格
  • 最火的做牛排沙拉网站/宁波seo搜索引擎优化
  • 做网站大家都找谁/百度网站提交收录入口
  • 博罗做网站哪家强/微信广告推广价格表
  • 交友网站建设的栏目规划/百度云搜索入口
  • 网站开发常遇到客户问题/百度推广如何代理加盟
  • 爱做网站yeele/快速优化系统
  • 服务器搭建网站数据库/产品线上推广渠道
  • 要做网站到哪里做/网站设计规划
  • 自己建设企业网站/杭州专业seo服务公司
  • 做网站字体一般设置/关键词搜索工具好站网
  • 做网站用小型机或服务器/长尾关键词是什么
  • 怎么接做网站的任务/查看域名每日ip访问量
  • 网站面试通知表格怎么做/西安网站优化培训
  • 无锡网站建设公司怎么样/怎么免费创建网站
  • 所有免费的网站有哪些/泉州排名推广
  • 做网站的一个月能赚多少钱/公司网站免费建站
  • 做网站 需要什么营业执照/深圳市社会组织总会
  • 互联网金融p2p网站建设模板/关键词优化难度查询
  • 南通网站制作计划/合肥seo推广培训班
  • 推广游戏网站怎么做/品牌推广方案包括哪些
  • 找团队做网站/推广搜索引擎
  • 深圳哪里可以做物流网站/互联网推广
  • 2免费做网站/长沙百度推广排名
  • 装修案例分析/seo专业课程