这里使用Spring Security主要是使用了他的加密算法,而JWT用的是他的认证,一个比较经典的组合。
一、主要处理密码加密的问题
1.导依赖
<dependency><!--使用到其中的加密算法-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.配置类
springsecurity默认配置文件是拦截所有路径,这显然是我们不想看到的,所以我们要写个配置文件代替他。但是,springboot都去掉了配置文件了,所以我们使用配置类来完成。
3.启动类里,把配置类扔到容器中。
4.adminservice方法添加管理员时密码加密一下
5.测试
6.管理员登陆密码校验
感觉教程写得代码有点随意,思路反正就是先用户名查有没有这个 用户,然后匹配密码看看能不能匹配。没啥难度。
7.用户注册加密,登陆验证。其实跟上差不多,为了方便,先把发送验证码注释掉。
二、认证的问题
1.
服务器端不需要存储登陆信息,是一种无状态的认证方式。
2.
但是容易受到csrf攻击,并且麻烦,而且安卓、IOS没有这个玩意。。。
3.
4.
我们这里采用的是第四种:
三、关于JWT
理论部分后期在整理一下吧
Java开发使用的JWT
1.改造common模块加入:
1)引入依赖
<!--jjwt实现token验证登陆的功能-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
2)引入工具类,其实就是生成令牌和解析令牌
3)在用户模块实践
完善管理员登陆,登陆后生成令牌
1》配置文件给出jwtUtil需要的参数配置
2)启动类把工具类扔到spring容器
3)完善代码
测试
4)完善管理员删除用户功能,增加权限认证
疑问:这个东西可以直接注入用嘛,如果能这样直接注入,又涉不涉及线程问题呢?
测试:
删除成功的情况,是正常的。
但是,条件判断,不匹配抛出异常时,是有问题的。直接抛出的是controller层的异常。如代码所示,个人感觉教程异常处理这部分做的不好,先这样把,后期调一下!!!!
6)拦截器优化上边的代码
1》使用拦截器将公共代码提取出来,但他其实不是真的拦截了什么,拦截器内全部放行,但是对于有请求头相关信息 的及逆行解析。
package com.scbg.user.interceptor;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import util.JwtUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @program: tensquare_parent52
* @description: 拦截器统一拦截请求,并对请求中含有token进行解析。
* @author: 三层饼干儿
* @create: 2019-09-14 20:11
**/
@Component
public class JwtInterceptor implements HandlerInterceptor{
@Autowired
private JwtUtil jwtUtil;
public boolean preHandler(HttpServletRequest request, HttpServletResponse response,Object handler)throws Exception{
//默认相当于全放行,具体可否进行访问,每个方法需要的权限可能不同,在具体方法中判断。
// 拦截器主要负责将请求头中的头肯进行解析验证。
String header = request.getHeader("Authorization");
if (header!=null&&!"".equals(header)){
if (header.startsWith("Bearer ")){
//获取token
String token = header.substring(7);
//验证token
try {
Claims claims = jwtUtil.parseJWT(token);
String role=(String)claims.get("roles");
if (role!=null&&"admin".equals(role)){//如果角色为管理员,将其放入request中
request.setAttribute("claims_admin",token);
}
if (role!=null&&"user".equals(role)){//如果角色为管理员,将其放入request中
request.setAttribute("claims_user",token);
}
}catch (Exception e){
throw new RuntimeException("token不正确!");
}
}
}
return true;//全部放行,只不过request携带的信息不同而已。
}
}
2》需要配置拦截器,使用配置类完成配置
package com.scbg.user.config;
import com.scbg.user.interceptor.JwtInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* @program: tensquare_parent52
* @description: 相当于以前ssm项目配置拦截器的配置文件
* @author: 三层饼干儿
* @create: 2019-09-14 20:29
**/
@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport{
@Autowired
private JwtInterceptor jwtInterceptor;
public void addInterceptor(InterceptorRegistry registry){
//注册拦截器要声明拦截器对象和要拦截的请求
registry.addInterceptor(jwtInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login/**");//登陆不需要拦截
}
}
ps:
之后测试成功!
7)用户增加问题练练手巩固一下,复制粘贴没啥难度,测试成功。