单点登录失败解决措施 单点登录框架有哪些


单点登录失败解决措施 单点登录框架有哪些

文章插图
背景分析传统的登录系统中,每个站点都实现了自己的专用登录模块 。各站点的登录状态相互不认可,各站点需要逐一手工登录 。例如:
这样的系统,我们又称之为多点登陆系统 。应用起来相对繁琐(每次访问资源服务都需要重新登陆认证和授权) 。与此同时,系统代码的重复也比较高 。由此单点登陆系统诞生 。
单点登陆系统单点登录,英文是 Single Sign On(缩写为 SSO) 。即多个站点共用一台认证授权服务器,用户在其中任何一个站点登录后,可以免登录访问其他所有站点 。而且,各站点间可以通过该登录状态直接交互 。例如:
快速入门实践工程结构如下基于资源服务工程添加单点登陆认证和授权服务,工程结构定义如下:
创建认证授权工程添加项目依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>构建项目配置文件在sca-auth工程中创建bootstrap.yml文件,例如:
server:port: 8071spring:application:name: sca-authcloud:nacos:discovery:server-addr: localhost:8848config:server-addr: localhost:8848添加项目启动类package com.jt;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class ResourceAuthApplication {public static void main(String[] args) {SpringApplication.run(ResourceAuthApplication.class, args);}}启动并访问项目项目启动时,系统会默认生成一个登陆密码,例如:
其中,默认用户名为user,密码为系统启动时,在控制台呈现的密码 。执行登陆测试,登陆成功进入如下界面(因为没有定义登陆页面,所以会出现404):
自定义登陆逻辑业务描述我们的单点登录系统最终会按照如下结构进行设计和实现,例如:
我们在实现登录时,会在UI工程中,定义登录页面(login.html),然后在页面中输入自己的登陆账号,登陆密码,将请求提交给网关,然后网关将请求转发到auth工程,登陆成功和失败要返回json数据,在这个章节我们会按这个业务逐步进行实现
定义安全配置类修改SecurityConfig配置类,添加登录成功或失败的处理逻辑,例如:
package com.jt.auth.config;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.web.authentication.AuthenticationFailureHandler;import org.springframework.security.web.authentication.AuthenticationSuccessHandler;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.HashMap;import java.util.Map;@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {/**初始化密码加密对象*/@Beanpublic BCryptPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}/**在这个方法中定义登录规则* 1)对所有请求放行(当前工程只做认证)* 2)登录成功信息的返回* 3)登录失败信息的返回* */@Overrideprotected void configure(HttpSecurity http) throws Exception {//关闭跨域工具http.csrf().disable();//放行所有请求http.authorizeRequests().anyRequest().permitAll();//登录成功与失败的处理http.formLogin().successHandler(successHandler()).failureHandler(failureHandler());}@Beanpublic AuthenticationSuccessHandler successHandler(){//return new AuthenticationSuccessHandler() {//@Override//public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {////}//}return (request,response,authentication) ->{//1.构建map对象,封装响应数据Map<String,Object> map=new HashMap<>();map.put("state",200);map.put("message","login ok");//2.将map对象写到客户端writeJsonToClient(response,map);};}@Beanpublic AuthenticationFailureHandler failureHandler(){return (request,response, e)-> {//1.构建map对象,封装响应数据Map<String,Object> map=new HashMap<>();map.put("state",500);map.put("message","login failure");//2.将map对象写到客户端writeJsonToClient(response,map);};}private void writeJsonToClient(HttpServletResponse response,Object object) throws IOException {//1.将对象转换为json//将对象转换为json有3种方案://1)Google的Gson-->toJson(需要自己找依赖)//2)阿里的fastjson-->JSON (spring-cloud-starter-alibaba-sentinel)//3)Springboot web自带的jackson-->writeValueAsString (spring-boot-starter-web)//我们这里借助springboot工程中自带的jackson//jackson中有一个对象类型为ObjectMapper,它内部提供了将对象转换为json的方法//例如:String jsonStr=new ObjectMapper().writeValueAsString(object);//3.将json字符串写到客户端PrintWriter writer = response.getWriter();writer.println(jsonStr);writer.flush();}}定义用户信息处理对象在spring security应用中底层会借助UserDetailService对象获取数据库信息,并进行封装,最后返回给认证管理器,完成认证操作,例如:


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: