从永远到永远-SpringCloud-TenSquare项目实战-SpringSecurity+JWT实现用户登陆

在这里插入图片描述
这里使用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)用户增加问题练练手巩固一下,复制粘贴没啥难度,测试成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值