单点登录系统知识点总结( 二 )


先设计一个 ,Bean出对象用来构建密码加密对象,登录时,系统底层会基于此对象进行密码加密 。
认证流程分析
当用户发送登录请求的时候,进入到由多个过滤器构成的过滤链进行对用户和密码简单的校验,再提交到认证管理器,再通过认证管理器调用到的从数据库中取到的数据进行比对 。而从数据库中取出的密码是加密的形式,而用户输入密码传到管理器不是加密的形式,不能直接比对,因此就需要在认证管理器中对用户输入进来的密码进行加密,所以要配置一个可以对密码进行加密的算法,数据库中的密码进行加密使用的算法是r()的算法,因此就有了配置类进行密码加密,并且使用BCry的加密算法 。
底层所调用数据库数据的逻辑:
是r认证管理器的实现类,认证管理器主要的作用就是密码的比对,身份的认证,再去调用er中的vider认证服务提供方,vider调用接口中实现类的方法,主要是去访问数据库,我们自己写了一个pl类去实现接口,重写其方法去调用数据库
单体架构的登录系统
到目前为止就是一个简单的单体架构的登录,
3)构建令牌生成及配置对象
本次我们借助JWT(Json Web Token-是一种json格式)方式将用户相关信息进行组织和加密,并作为响应令牌(Token),从服务端响应到客户端,客户端接收到这个JWT令牌之后,将其保存在客户端(例如),然后携带令牌访问资源服务器,资源服务器获取并解析令牌的合法性,基于解析结果判定是否允许用户访问资源.
因此写一个 类,用来配置令牌的生成,存储策略,验签方式(令牌合法性) 。
4)构建配置类 负责将所有的认证和授权相关配置进行整合
业务方面:
2.pl类中的代码实现 (1.)pojo实体类对象User (2.)负责远程调用的接口
package com.jt.auth.service;import com.jt.auth.pojo.User;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import java.util.List;/*** Feign远程调用接口,在接口中对sso-system进行远程服务调用* */@FeignClient(value = "http://www.kingceram.com/post/sso-system",contextId ="remoteUserService" )public interface RemoteUserService {/*** 基于用户名查询用户信息* */@GetMapping("/user/login/{username}")User selectUserByUsername(@PathVariable("username") String username);/*** 基于用户id获取用户权限* */@GetMapping("/user/permission/{userId}")List selectUserPermissions(@PathVariable("userId") Long userId);}
(3.)pl
package com.jt.auth.service;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.authority.AuthorityUtils;import org.springframework.security.core.userdetails.User;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.stereotype.Service;import java.util.List;@Slf4j@Servicepublic class UserDetailsServiceImpl implements UserDetailsService {@Autowired //注入的是负责远程调用的接口private RemoteUserService remoteUserService;/*** 我们执行登录操作时,提交登录按钮系统会调用此方法* 参数:username来自客户端用户提交的用户名* 返回值:封装了登录用户信息以及用户权限信息的一个对象,返回的UserDetails对象最终会交给认证管理器* */@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//1.基于用户名查找用户信息,判断用户名是否存在com.jt.auth.pojo.User user= remoteUserService.selectUserByUsername(username);if(user==null)throw new UsernameNotFoundException("用户不存在");//2.基于用户id查询用户权限(登录用户不一定可以访问所有资源)List