- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- SpringBoot如何實(shí)現同域SSO(單點(diǎn)登錄)
單點(diǎn)登錄,其實(shí)看起來(lái)不是很復雜,只是細節上的處理,單點(diǎn)區分有三種
個(gè)人理解:當用戶(hù)登錄訪(fǎng)問(wèn)demo1.lzmvlog.top
時(shí),同時(shí)具有訪(fǎng)問(wèn)demo2.lzmvlog.top
的能力,即認證完成一次,可以訪(fǎng)問(wèn)所有系統。
實(shí)現方式:可以采用Cookie
實(shí)現,即用戶(hù)在訪(fǎng)問(wèn)一個(gè)系統時(shí),攜帶認證頒發(fā)的信息,系統響應是否具有訪(fǎng)問(wèn)資格,否則跳轉認證,也可以采用Session
,即Session
共享,校驗訪(fǎng)問(wèn)用戶(hù)是否具有有效的信息,提供訪(fǎng)問(wèn)資格
<!--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: 8090 spring: 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
當用戶(hù)訪(fǎng)問(wèn)除登錄界面時(shí),都需要提前認證,認證完成之后需要跳轉到之前訪(fǎng)問(wèn)的路徑上,并提供訪(fǎng)問(wèn)別的系統的權限。
實(shí)現邏輯,當用戶(hù)訪(fǎng)問(wèn)任何路徑時(shí),都需要通過(guò)攔截器的校驗,確認擁有訪(fǎng)問(wèn)的權限,才能放行通過(guò),不具有訪(fǎng)問(wèn)權限的,重定向到 登錄界面,并保存原有訪(fǎng)問(wèn)的頁(yè)面路徑,驗證成功的時(shí)候跳轉到原有頁(yè)面
@Controller public 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) { // 用戶(hù)登錄 boolean exists = userRepository.exists(Example.of(new User() .setUsername(username) .setPassword(password))); if (exists) { Cookie cookie = new Cookie("username", username); response.addCookie(cookie); // 如果正常訪(fǎng)問(wèn)即跳轉到正常頁(yè)面 if (StringUtils.isEmpty(url)) { return "demo1"; } // 如果之前存在訪(fǎng)問(wèn)的頁(yè)面,認證完成即跳轉會(huì )原有的頁(yè)面 return url; } return "index"; } /** * 跳轉到 demo2 * * @return */ @GetMapping("demo2") public String demo2() { return "demo2"; } /** * 跳轉到 demo1 * * @return */ @GetMappi=ng("demo1") public String demo1() { return "demo1"; } }
@Component public 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 { // 獲取當前請求得路徑 如果不是正常得登錄界面請求 登錄成功之后需要跳轉到原來(lái)請求得界面上 String servletPath = request.getServletPath(); // 對不需要攔截得路徑進(jìn)行放行 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
之后不能生效,需要將攔截器添加到攔截器鏈路中,即:
@Configuration public 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); } }
其實(shí)攔截器還有第二種實(shí)現方式,即通過(guò)Filter
接口實(shí)現
@Component public class CookieFilter extends OncePerRequestFilter { @Autowired UserRepository userRepository; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 獲取當前請求得路徑 如果不是正常得登錄界面請求 登錄成功之后需要跳轉到原來(lái)請求得界面上 String servletPath = request.getServletPath(); IndexController indexController = new IndexController(); // 對不需要攔截得路徑進(jìn)行放行 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("/"); } } }
其實(shí)也可以采用Session
的方式實(shí)現,采用共享Session
的方式,我這里只是簡(jiǎn)單的實(shí)現一下,其實(shí)在認證時(shí)可以結合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
只需要坐一下簡(jiǎn)單的區分,知道是哪個(gè)頁(yè)面就行了
同域SSO
其實(shí)不是很復雜,只是了解一下整個(gè)訪(fǎng)問(wèn)的過(guò)程,和需要做的一些限制即可,后續看看做后面兩種的實(shí)現
即同父域SSO
和跨域SSO
以上就是SpringBoot如何實(shí)現同域SSO(單點(diǎn)登錄)的詳細內容,更多關(guān)于SpringBoot 實(shí)現同域SSO的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站