Springboot整合JWT integration微服务,进来看看?

基于spring security form的登录认证流程图如下:

Springboot整合JWT integration微服务,进来看看?

一般过程是将用户名和密码封装到usernamepasswordauthenticationfilter中的usernamepasswordauthenticationtoken中,然后在authenticationprovider(接口,需要自己实现)的Authentication方法中获取并验证(一般检查数据库并比较帐户和密码)。如果验证成功,将返回authentication interface对象(通常直接返回usernamepasswordauthenticationtoken,默认情况下,该对象将记录在会话的securitycontext和securitycontextholder中)。然后,将遵循身份验证成功过程(通常将实现authenticationsuccesshandler接口)。否则,将丢弃身份验证失败过程(通常将实现authenticationfailurehandler接口)。

以上是普通单体项目的认证过程,那么整合JWT或者说微服务则会有以下问题:

  1.  在哪里生成JWT?
  2. 如何解释前端传来的JWT字符串获取到用户信息?
  3. 认证成功后如何去除Session信息?(JWT是无状态的,不需要服务器端保存)

对于第一个问题,很好解决,在AuthenticationProvider认证成功后不返回UsernamePasswordAuthenticationToken,返回自定义的JwtAuthenticationToken,然后在自定义的LoginSuccessHandler返回给前端即可,代码如下:

请注意,必须执行以下代码:

JwtAuthenticationToken JwtAuthenticationToken=新的JwtAuthenticationToken(userDetails,Collections.singleton(simpleGrantedAuthority));
jwtAuthenticationToken.setAuthenticated(true);

除了身份验证接口之外,abstractsecurityinterceptor将拦截所有需要授权()的其他接口,abstractsecurityinterceptor具有AuthenticateFrequeired方法。如果不叫
jwtAuthenticationToken.setAuthenticated(true);将再次执行用户身份验证。源代码如下:

if(num==1) 
			System.out.println("输出"+num);

		else 
			--num;
			System.out.println("输出"+--num);
		
//死循环
//空循环
public class Test02 {
	public static void main(String[]args){
		int i=1;
		while(i<10){
		System.out.println("输出"+i);
		i++;
	}
	
	}
	
}

<build>
	<resources>
		<resource>
			<directory>src/main/java</directory>
			<includes>
				<include>**/*.xml</include>
			</includes>
			<filtering>false</filtering>
		</resource>
	</resources>   
</build>
<update id="updateBatchSingle"  parameterType="java.util.List">
  <foreach collection="list" item="item" index="index" open="" close=";" separator=";">
    update user
    <set>
      status = #{item.status}
    </set>
    where id = #{item.id}
  </foreach>
</update>
/*
     * @Author Mulan
     * @Email 2992794262@qq.com
     * @ClassName Manage
     * @Description //TODO 添加学生信息
     * @Date 17:48 2021/9/26
     **/
public  static void  add(){
        System.out.println("--------------添加学生信息-------- ");
        Student s=new Student();
        System.out.print("学号:");
        int id=input.nextInt();
        //如果学生的学号没有被占用,就开始存入学生信息
        if (!idList.contains(id)){
            //将学生学号存入容器,保证学号的唯一性
            idList.add(id);
            //设置学生的学号
            s.setId(id);
            System.out.print("姓名:");s.setName(input.next());
            System.out.print("性别:");s.setSex(input.next());
            System.out.print("年龄:");s.setAge(input.nextInt());
            System.out.print("居住地:");s.setResidence(input.next());
            arrayList.add(s);
            System.out.print("添加已完成......是否退出 回到主界面? (y/n)");
            String a=input.next();
            //继续添加学生信息
            if (a.equals("n")){
                add();
            }
            //回到主界面
            else
            {
                Test.main(null);
            }
        }
        else{
            System.out.println("该学号被占用......请重新输入");
            add();
        }
    }

 

上一篇:day72


下一篇:仅需四步,整合SpringSecurity+JWT实现登录认证