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

permissions = remoteUserService.selectUserPermissions(user.getId());//可以打印出有哪些权限信息log.info("permissions {}",permissions.toString());//3.封装查询结果并返回//这里为什么要new User(),需要查UserDetailsService接口实现类底层源码 。return new User(user.getUsername(),user.getPassword(),AuthorityUtils.createAuthorityList(permissions.toArray(new String[]{})));}}
new User()需要的三个参数:
使用.()可以转化成参数所需的类型,()中里要填写的是…数组,因此就需要将转化为数组——.([]{}) 。
3.代码实现
@Configurationpublic class SecurityConfig{}
(1.)构建密码加密对象
//构建密码加密对象,登录时,系统底层会基于此对象进行密码加密@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}
(2.)前后端分离架构中,对成功和失败以后的信息以json形式进行返回
要继承,重写其中的( http)方法——这个方法会在服务启动时就会启动,进行自定义的配置
@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception{//super.configure(http);//默认所有请求都要认证,不需要//1.禁用跨域攻击(先这么写,不写会报403异常,这里的登录默认是post请求,但系统底层的跨域设计是不允许post请求,)http.csrf().disable();//2.放行所有资源的访问(后续可以基于选择对资源进行认证和放行)此处是根据业务需求进行选择//3.自定义登录成功和失败以后的处理逻辑(目的是响应到客户端的数据是json字符串)//默认没有配置,会跳转到登录成功或失败的页面,实际上前后端分离架构中服务端不负责页面跳转,只负责返回json数据http.formLogin()//登录表单,此方法执行后会生成一个/login的url//登录成功处理器successHandler.successHandler(successHandler())//启动时就会调用,并不会登录成功才调用.failureHandler(failureHandler());}}
放行资源访问的方式
()所有的请求路径
(3.)定义认证成功处理器和失败处理器
//定义认证成功处理器//登录成功以后返回json数据@Beanpublic AuthenticationSuccessHandler successHandler() {return (request, response, authentication) -> {//定义响应数据Map map = new HashMap<>();map.put("state",200);map.put("message","login success");//将响应数据写到客户端,调用writeJsonToClient方法writeJsonToClient(response,map);};}//定义登录失败处理器@Beanpublic AuthenticationFailureHandler failureHandler() {return (request,response,exception)->{//构建map对象封装到要响应到客户端的数据Map map=new HashMap<>();map.put("state",500);map.put("message", "login error");//将map对象转换为json格式字符串并写到客户端writeJsonToClient(response,map);};}private void writeJsonToClient(HttpServletResponse response,Map map) throws IOException {//将要响应到客户端的数据转化成json格式的字符串String json=new ObjectMapper().writeValueAsString(map);//设置响应数据的编码方式response.setCharacterEncoding("utf-8");//告诉浏览器响应数据的类型以及编码response.setContentType("application/json;charset=utf-8");//将字符串内容响应到客户端PrintWriter out=response.getWriter();out.println(json);out.flush();//刷新}
(4.)定义认证管理器对象,这个对象负责完成用户信息的认证
即判定用户身份信息的合法性,在基于协议完成认证时,需要此对象,所以这里将此对象拿出来交给管理