国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

SpringBoot如何實(shí)現同域SSO(單點(diǎn)登錄)

發(fā)布時(shí)間:2021-07-06 11:13 來(lái)源:腳本之家 閱讀:0 作者:是小張啊 欄目: 開(kāi)發(fā)技術(shù) 歡迎投稿:712375056

目錄

    單點(diǎn)登錄,其實(shí)看起來(lái)不是很復雜,只是細節上的處理,單點(diǎn)區分有三種

    • 同域SSO
    • 同父域SSO
    • 跨域的SSO

    如何實(shí)現同域SSO?

    個(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)資格

    代碼實(shí)現

    依賴(lài)

    <!--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";
        }
    
    }

    攔截器實(shí)現

    @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.htmldemo2.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í)歡迎投稿傳遞力量。

    成年女人免费视频播放体验区| 午夜福利92国语| 伊人久久综合色| 亚洲中文字幕日产无码成人片| 亚洲国产天堂久久综合226114| 国产精品美女乱子伦高潮|