电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SpringBoot如何實現同域SSO(單點登錄)

瀏覽:106日期:2023-03-11 11:46:54
目錄如何實現同域SSO?代碼實現依賴配置控制器攔截器實現界面

單點登錄,其實看起來不是很復雜,只是細節上的處理,單點區分有三種

同域SSO 同父域SSO 跨域的SSO 如何實現同域SSO?

個人理解:當用戶登錄訪問demo1.lzmvlog.top時,同時具有訪問demo2.lzmvlog.top的能力,即認證完成一次,可以訪問所有系統。

實現方式:可以采用Cookie實現,即用戶在訪問一個系統時,攜帶認證頒發的信息,系統響應是否具有訪問資格,否則跳轉認證,也可以采用Session,即Session共享,校驗訪問用戶是否具有有效的信息,提供訪問資格

代碼實現依賴

<!--spring-data-jpa--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- mysql --><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency>配置

server: port: 8090spring: application: name: authority datasource: url: jdbc:mysql://127.0.0.1:3306/SSO?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver

當用戶訪問除登錄界面時,都需要提前認證,認證完成之后需要跳轉到之前訪問的路徑上,并提供訪問別的系統的權限。

實現邏輯,當用戶訪問任何路徑時,都需要通過攔截器的校驗,確認擁有訪問的權限,才能放行通過,不具有訪問權限的,重定向到 登錄界面,并保存原有訪問的頁面路徑,驗證成功的時候跳轉到原有頁面

控制器

@Controllerpublic class IndexController { @Autowired UserRepository userRepository; /** * 將要跳轉的路徑 */ public String url; /** * 登錄界面 * * @return */ @GetMapping('/index') public String index() {return 'index'; } /** * 登錄界面 * * @return */ @GetMapping('/') public String index1() {return 'index'; } /** * 登錄請求接口 * * @param username 賬號 * @param password 密碼 * @param response * @return */ @PostMapping('login') public String login(String username, String password, HttpServletResponse response) {// 用戶登錄boolean exists = userRepository.exists(Example.of(new User().setUsername(username).setPassword(password)));if (exists) { Cookie cookie = new Cookie('username', username); response.addCookie(cookie); // 如果正常訪問即跳轉到正常頁面 if (StringUtils.isEmpty(url)) {return 'demo1'; } // 如果之前存在訪問的頁面,認證完成即跳轉會原有的頁面 return url;}return 'index'; } /** * 跳轉到 demo2 * * @return */ @GetMapping('demo2') public String demo2() {return 'demo2'; } /** * 跳轉到 demo1 * * @return */ @GetMappi=ng('demo1') public String demo1() {return 'demo1'; }}攔截器實現

@Componentpublic class CookieHandlerInterceptor implements HandlerInterceptor { @Autowired UserRepository userRepository; @Autowired IndexController indexController; /** * 執行方法之前 * * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 獲取當前請求得路徑 如果不是正常得登錄界面請求 登錄成功之后需要跳轉到原來請求得界面上String servletPath = request.getServletPath();// 對不需要攔截得路徑進行放行if ('/index'.equals(servletPath) || '/'.equals(servletPath) || '/login'.equals(servletPath)) { return true;}if (!'/index'.equals(servletPath) || !'/'.equals(servletPath)) { indexController.url = servletPath;}Cookie[] cookies = request.getCookies();boolean exists = false;if (cookies != null) { for (Cookie cookie : cookies) {String value = cookie.getValue();if (!StringUtils.isEmpty(value)) { exists = userRepository.exists(Example.of(new User() .setUsername(value)));} }}if (exists) { return true;} else { response.sendRedirect('/index');}return false; }}

在SpringBoot2.x之后不能生效,需要將攔截器添加到攔截器鏈路中,即:

@Configurationpublic class WebMvcConfig extends WebMvcConfigurationSupport { /** * Session 攔截處理器 */ @Autowired private CookieHandlerInterceptor cookieHandlerInterceptor; /** * 添加攔截器 * * @param registry */ @Override protected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(this.cookieHandlerInterceptor).addPathPatterns('/**');super.addInterceptors(registry); }}

其實攔截器還有第二種實現方式,即通過Filter接口實現

@Componentpublic class CookieFilter extends OncePerRequestFilter { @Autowired UserRepository userRepository; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {// 獲取當前請求得路徑 如果不是正常得登錄界面請求 登錄成功之后需要跳轉到原來請求得界面上String servletPath = request.getServletPath();IndexController indexController = new IndexController();// 對不需要攔截得路徑進行放行if ('/index'.equals(servletPath) || '/'.equals(servletPath) || '/login'.equals(servletPath)) { filterChain.doFilter(request, response);}if (!'/index'.equals(servletPath) || !'/'.equals(servletPath)) { indexController.url = servletPath;}Cookie[] cookies = request.getCookies();boolean exists = false;if (cookies != null) { for (Cookie cookie : cookies) {String value = cookie.getValue();if (!StringUtils.isEmpty(value)) { exists = userRepository.exists(Example.of(new User() .setUsername(value)));} }}if (exists) { filterChain.doFilter(request, response);} else { response.sendRedirect('/');} }}

其實也可以采用Session的方式實現,采用共享Session的方式,我這里只是簡單的實現一下,其實在認證時可以結合SpringSecurity或者Shiro安全框架去整合JWT以保證信息的安全

界面

index.html

<!DOCTYPE html><html><head> <meta charset='UTF-8'> <title>登錄</title></head><body><div align='center'> <h1>請登錄</h1> <form action='/login' method='post'><span>賬號:</span><input name='username' type='text' value='zhang'><br><span>密碼:</span><input name='password' type='password' value='123456'><br><button type='submit' style='margin: 10px 0'>登錄</button> </form></div></body></html>

demo1.html和demo2.html只需要坐一下簡單的區分,知道是哪個頁面就行了

同域SSO其實不是很復雜,只是了解一下整個訪問的過程,和需要做的一些限制即可,后續看看做后面兩種的實現

即同父域SSO和跨域SSO

以上就是SpringBoot如何實現同域SSO(單點登錄)的詳細內容,更多關于SpringBoot 實現同域SSO的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 福建珂朗雅装饰材料有限公司「官方网站」 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 自动焊锡机_点胶机_螺丝机-锐驰机器人 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 游动电流仪-流通式浊度分析仪-杰普仪器(上海)有限公司 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 | 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 恒温油槽-恒温水槽-低温恒温槽厂家-宁波科麦仪器有限公司 | 电磁铁_推拉电磁铁_机械手电磁吸盘电磁铁厂家-广州思德隆电子公司 | 排烟防火阀-消防排烟风机-正压送风口-厂家-价格-哪家好-德州鑫港旺通风设备有限公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 河南凯邦机械制造有限公司| 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 标准光源箱|对色灯箱|色差仪|光泽度仪|涂层测厚仪_HRC大品牌生产厂家 | 线材成型机,线材折弯机,线材成型机厂家,贝朗自动化设备有限公司1 | 缠绕机|缠绕膜包装机|缠绕包装机-上海晏陵智能设备有限公司 | 消防泵-XBD单级卧式/立式消防泵-上海塑泉泵阀(集团)有限公司 | 风电变桨伺服驱动器-风电偏航变桨系统-深圳众城卓越科技有限公司 | 防爆电机_ybx3系列电机_河南省南洋防爆电机有限公司 | 多物理场仿真软件_电磁仿真软件_EDA多物理场仿真软件 - 裕兴木兰 | 空压机商城|空气压缩机|空压机配件-压缩机网旗下商城 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 危废处理系统,水泥厂DCS集散控制系统,石灰窑设备自动化控制系统-淄博正展工控设备 | 查分易-成绩发送平台官网| 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 耐酸泵,耐酸泵厂家-淄博华舜耐腐蚀真空泵 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 河南彩印编织袋,郑州饲料编织袋定制,肥料编织袋加工厂-盛军塑业 河南凯邦机械制造有限公司 |