基于spring security form的登录认证流程图如下:
一般过程是将用户名和密码封装到usernamepasswordauthenticationfilter中的usernamepasswordauthenticationtoken中,然后在authenticationprovider(接口,需要自己实现)的Authentication方法中获取并验证(一般检查数据库并比较帐户和密码)。如果验证成功,将返回authentication interface对象(通常直接返回usernamepasswordauthenticationtoken,默认情况下,该对象将记录在会话的securitycontext和securitycontextholder中)。然后,将遵循身份验证成功过程(通常将实现authenticationsuccesshandler接口)。否则,将丢弃身份验证失败过程(通常将实现authenticationfailurehandler接口)。
以上是普通单体项目的认证过程,那么整合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(); } }