Spring Security 의 간단 한 사용

16783 단어 SpringSecurity
Spring Security 가 뭐 예요?
  • Spring Security 는 기능 이 강하 고 고도 로 맞 춤 형 인증 과 방문 제어 프레임 워 크 입 니 다.이것 은 실제 적 으로 spring 기반 프로그램 을 보호 하 는 표준 이다.
  • Spring Security 는 자바 응용 프로그램 에 인증 과 권한 수 여 를 제공 하 는 프레임 워 크 입 니 다.모든 Spring 프로젝트 와 마찬가지 로 Spring 안전성 의 진정한 강 한 점 은 맞 춤 형 수 요 를 만족 시 키 기 위해
  • 을 쉽게 확장 할 수 있다 는 것 이다.
  • 사용자 인증 에 있어 Spring Security 프레임 워 크 는 HTTP 기본 인증,HTTP 폼 검증,HTTP 요약 인증,OpenID 와 LDAP 등 주류 인증 방식 을 지원 한다.사용자 권한 수여 에 있어 Spring Security 는 역할 기반 접근 제어 와 접근 제어 목록(Access Control List,ACL)을 제공 하여 응용 분야 의 대상 을 세분 화 할 수 있 습 니 다.
  • 봄 보안 테스트
    전기 준비
  • 새로운 springboot 프로젝트 를 만 들 고 웹 템 플 릿 과 thymeleaf 템 플 릿
  • 을 가 져 옵 니 다.
  • 정적 자원 가 져 오기
  • thymeleaf 캐 시 spring.thymeleaf.cache=false
  • 닫 기
  • 먼저 TestController 를 만들어 프로젝트 의 성공 여 부 를 테스트 합 니 다
  • 
    package com.example.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @Controller
    public class TestController {
    
        @RequestMapping("/")
        public String index(){
            return "index";
        }
    
        @RequestMapping("/toLogin")
        public String toLogin(){
            return "views/login";
        }
    
        @RequestMapping("/level1/{id}")
        public String level1(@PathVariable("id") int id){
            return "views/level1/"+id;
        }
    
        @RequestMapping("/level2/{id}")
        public String level2(@PathVariable("id") int id){
            return "views/level2/"+id;
        }
    
        @RequestMapping("/level3/{id}")
        public String level3(@PathVariable("id") int id){
            return "views/level3/"+id;
        }
    
    }
    
    
    SpringSecurity 사용
    spring-boot-starter-security 모듈 도입
    
     <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    SpringSecurity 의 몇 가지 중요 한 유형 을 알 고 있 습 니 다.
  • WebSecurity ConfigurerAdapter:사용자 정의 보안 정책
  • AuthenticationManager Builder:사용자 정의 인증 정책
  • @EnableWebSecurity:웹 보안 모드 열기
  • SpringSecurity--권한 수여(코드 와 주석 을 잘 보십시오)
    
    //  
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().antMatchers("/").permitAll() //         
                    .antMatchers("/level1/**").hasRole("vip1")   //level1    ,VIP1    
                    .antMatchers("/level2/**").hasRole("vip2")
                    .antMatchers("/level3/**").hasRole("vip3");
    
            //           ,
            // ,       ,    ,         ,   ,          ,
            //              ,     http.formLogin();
            http.formLogin().loginPage("/toLogin");//      ,                 
    
            //             
            http.formLogin().usernameParameter("username")
                    .passwordParameter("password")
                    .loginPage("/toLogin")
                    .loginProcessingUrl("/login");
    
    
            //            
            // /logout       http.logout();
            http.csrf().disable();//  csrf  :      ,      post    logout  
            http.logout().logoutSuccessUrl("/");//         
    
            //        http.rememberMe();
            http.rememberMe().rememberMeParameter("remember");//             
        }
    
    SpringSecurity--인증(코드 와 주석 을 잘 보 세 요)
    
        //  
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            /*
                auth.inMemoryAuthentication().withUser("xiaomi").password("123").roles("vip1")
                       ,   500  。
                      :      
                Spring security 5.0          ,         。
                              ,      configure    。                    
                spring security         bcrypt    。
                     passwordEncoder(new BCryptPasswordEncoder())         
           */
            //            
            auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                    .withUser("xiaolong").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1")
                    .and()
                    .withUser("xiaomi").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2")
                    .and()
                    .withUser("xiaohu").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3");
    
            // jdbc        
            //auth.jdbcAuthentication()
    
        }
    
    시작 테스트
    정적 자원
    login.html
    
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
        <title>  </title>
        <!--semantic-ui-->
        <link href="https://cdn.bootcss.com/semantic-ui/2.4.1/semantic.min.css" rel="external nofollow"  rel="external nofollow"  rel="stylesheet">
    </head>
    <body>
    
    <!--   -->
    <div class="ui container">
    
        <div class="ui segment">
    
            <div style="text-align: center">
                <h1 class="header">  </h1>
            </div>
    
            <div class="ui placeholder segment">
                <div class="ui column very relaxed stackable grid">
                    <div class="column">
                        <div class="ui form">
                            <form th:action="@{/login}" method="post">
                                <div class="field">
                                    <label>Username</label>
                                    <div class="ui left icon input">
                                        <input type="text" placeholder="Username" name="username">
                                        <i class="user icon"></i>
                                    </div>
                                </div>
                                <div class="field">
                                    <label>Password</label>
                                    <div class="ui left icon input">
                                        <input type="password" name="password">
                                        <i class="lock icon"></i>
                                    </div>
                                </div>
                                <div class="field">
                                    <input type="checkbox" name="remember">   
                                </div>
                                <input type="submit" class="ui blue submit button"/>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
    
            <div style="text-align: center">
                <div class="ui label">
                    </i>  
                </div>
                <br><br>
            </div>
            <div class="ui segment" style="text-align: center">
                <h3>Spring Security</h3>
            </div>
        </div>
    
    
    </div>
    
    <script th:src="@{/js/jquery-3.1.1.min.js}"></script>
    <script th:src="@{/js/semantic.min.js}"></script>
    
    </body>
    </html>
    
    index.html
    
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
        <title>  </title>
        <!--semantic-ui-->
        <link href="https://cdn.bootcss.com/semantic-ui/2.4.1/semantic.min.css" rel="external nofollow"  rel="external nofollow"  rel="stylesheet">
        <link th:href="@{/css/mystyle.css}" rel="external nofollow"  rel="stylesheet">
    </head>
    <body>
    
    <!--   -->
    <div class="ui container">
    
        <div class="ui segment" id="index-header-nav" th:fragment="nav-menu">
            <div class="ui secondary menu">
                <a class="item"  th:href="@{/index}" rel="external nofollow" >  </a>
    
                <!--    -->
                <div class="right menu">
                    <!--   -->
                    <!--sec:authorize="!isAuthenticated()        -->
                    <div sec:authorize="!isAuthenticated()">
                        <a class="item" th:href="@{/toLogin}" rel="external nofollow" >
                            <i class="address card icon"></i>   
                        </a>
                    </div>
    
                    <!--   -->
                    <!--sec:authorize="!isAuthenticated()            -->
                    <div sec:authorize="isAuthenticated()">
                        <a class="item">
                            <i class="address card icon"></i>
                               :<span sec:authentication="principal.username"></span>
                              :<span sec:authentication="principal.authorities"></span>
                        </a>
                    </div>
                    <!--  -->
                    <div sec:authorize="isAuthenticated()">
                        <a class="item" th:href="@{/logout}" rel="external nofollow" >
                            <i class="sign-out icon"></i>   
                        </a>
                    </div>
    
    
                </div>
            </div>
        </div>
    
        <div class="ui segment" style="text-align: center">
            <h3>Spring Security</h3>
        </div>
    
        <div>
            <br>
            <div class="ui three column stackable grid">
                <!-- sec:authorize="hasRole('vip1')    vip1         -->
                <div class="column" sec:authorize="hasRole('vip1')">
                    <div class="ui raised segment">
                        <div class="ui">
                            <div class="content">
                                <h5 class="content">Level 1</h5>
                                <hr>
                                <div><a th:href="@{/level1/1}" rel="external nofollow" ><i class="bullhorn icon"></i> Level-1-1</a></div>
                                <div><a th:href="@{/level1/2}" rel="external nofollow" ><i class="bullhorn icon"></i> Level-1-2</a></div>
                                <div><a th:href="@{/level1/3}" rel="external nofollow" ><i class="bullhorn icon"></i> Level-1-3</a></div>
                            </div>
                        </div>
                    </div>
                </div>
                <!-- sec:authorize="hasRole('vip2')    vip2         -->
                <div class="column" sec:authorize="hasRole('vip2')">
                    <div class="ui raised segment">
                        <div class="ui">
                            <div class="content">
                                <h5 class="content">Level 2</h5>
                                <hr>
                                <div><a th:href="@{/level2/1}" rel="external nofollow" ><i class="bullhorn icon"></i> Level-2-1</a></div>
                                <div><a th:href="@{/level2/2}" rel="external nofollow" ><i class="bullhorn icon"></i> Level-2-2</a></div>
                                <div><a th:href="@{/level2/3}" rel="external nofollow" ><i class="bullhorn icon"></i> Level-2-3</a></div>
                            </div>
                        </div>
                    </div>
                </div>
    
                <!-- sec:authorize="hasRole('vip3')    vip3         -->
                <div class="column" sec:authorize="hasRole('vip3')">
                    <div class="ui raised segment">
                        <div class="ui">
                            <div class="content">
                                <h5 class="content">Level 3</h5>
                                <hr>
                                <div><a th:href="@{/level3/1}" rel="external nofollow" ><i class="bullhorn icon"></i> Level-3-1</a></div>
                                <div><a th:href="@{/level3/2}" rel="external nofollow" ><i class="bullhorn icon"></i> Level-3-2</a></div>
                                <div><a th:href="@{/level3/3}" rel="external nofollow" ><i class="bullhorn icon"></i> Level-3-3</a></div>
                            </div>
                        </div>
                    </div>
                </div>
    
            </div>
        </div>
        
    </div>
    
    
    <script th:src="@{/js/jquery-3.1.1.min.js}"></script>
    <script th:src="@{/js/semantic.min.js}"></script>
    
    </body>
    </html>
    
    다른 작은 것들
  • TestController 를 테스트 하기 전에 spring-boot-starter-security 라 는 의존 도 를 미리 가 져 왔 다 면 첫 페이지 를 요청 할 때 프로그램 은 자동 으로 로그 인 페이지 로 이동 합 니 다.모든 요청 이 차단 되 어 로그 인 페이지
  • 에 머 물 러 있 습 니 다.
  • 사용자 가 아직 로그 인하 지 않 았 다 면 홈 페이지 만 볼 수 있 습 니 다.홈 페이지 의 모든 화면 을 클릭 하 는 요청 은 기본 로그 인 페이지 로 이동 합 니 다.그리고 인증 한 사용 자 를 통 해 로그 인 을 하고 로그 인 에 성공 하면 이전에 클릭 한 인터페이스의 요청 을 되 돌려 줍 니 다.즉,원래 인터페이스 에/level 1/1.html 가 있 습 니 다.로그 인하 지 않 으 면 기본 로그 인 인터페이스 로 바로 이동 합 니 다.로그 인 에 성공 하면 홈 페이지 로 돌아 가 는 것 이 아니 라/level 1/1.html 로 돌아 갑 니 다.이것 은 기본
  • 입 니 다.
  • 사용자 정의 로그 인 페이지 의 실현
  • 분석

    이상 은 Spring Security 의 간단 한 사용 에 대한 상세 한 내용 입 니 다.Spring Security 의 사용 에 관 한 자 료 는 다른 관련 글 을 주목 하 시기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기