이 기사는 Spring Boot의 스프링 보안을 통합하여 메소드에 대한 주석을 사용하여 권한 제어를 구현하고 MySQL에서 사용자 정보를로드하기 위해 사용자 정의 사용자 데일 서비스를 사용합니다. 보안과 함께 제공되는 MD5 암호화를 사용하여 사용자의 비밀번호를 암호화하십시오. 페이지 템플릿은 Thymeleaf 엔진을 사용합니다.
소스 코드 주소 : https://github.com/li5454yong/springboot-security.git
1. POM 의존성을 소개합니다
<부모> <groupid> org.springframework.boot </groupid> <artifactid> Spring-boot-starter-parent </artifactid> <bersion> 1.4.4. release> </parent> <pecientence> <pelection> <groupid> org.springframework.boot </groupId> <artifactid> spring-starateb </artifactid </의존성> <pectionency> <groupId> org.springframework.boot </groupid> <artifactid> Spring-Boot-Starter-Security </artifactid> </dependency> <groupId> org.springframework.security.oauth </groupId> </eppectid> spring-uuth- </artifactid> <pectionency> <groupid> org.springframework.boot </groupid> <artifactid> 스프링-부트-스타터-Thymeleaf </artifactid> </dependency> <groupid> org.springframework.boot </groupid> <artifactid> spring-bboot-starter-data-jpa </artifactid> </artifactid> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-jdbc </arevifactid> </eppendency> <pectionency> <groupId> mySQL </groupId> <artifactID> mysql-connector-java </artifactid> 5.1.34 </version> </inpexendency> </infection> </version> 5.1.34 <groupid> com.alibaba </groupid> <artifactid> druid </artifactid> <버전> 1.0.15 </version> </fectionency> </fectionements>
여기서 Druid Connection Pooling을 사용하고 Spring Data JPA는 데이터베이스 액세스를 구현합니다.
2. 스프링 보안을 구성하십시오
@configuration @enablewebmvcsecurity @enableglobalmethodsecurity (prepostenabled = true) // 보안 주석 활성화 공개 클래스 websecurityconfig 확장 websecurityconfigureradapter {@bean @bean @bean protected authenticationmanager () 예외 {return super.authenticmanager (); } @Override Protected Void Configure (httpsecurity http)는 예외를 던집니다. {// 모든 사용자가 "/"및 "/home"http.authorizerequests () .antMatchers ( "/", "/home")에 액세스 할 수 있도록합니다. // 로그인 페이지를 "/로그인".LoginPage ( "/login")로 지정하십시오 ..DefaultSuccessurl ( "/Hello") // 성공 후 "/hello"로 점프하십시오. .permitAll (). and () .logout () .logoutSuccessurl ( "/home") // 로그 아웃 후 기본 URL은 "/home".permitall (); } @autowired public void configureglobal (authenticationManagerBuilder Auth) 예외 {auth .userDetailsService (customUserDetailsService ()) .PasseWordEncoder (passwordEncoder ()); } / *** 사용자 비밀번호의 암호화 메소드를 MD5 암호화로 설정* @return* / @Bean public md5passwordencoder passwordEncoder () {return new Md5passwordencoder (); } / *** 데이터베이스에서 사용자 정보를 읽기 위해 Custom UserDetailSService* @return* / @bean publicuserDetailsService customUserDetailsService () {return new CustomUserDetailSService (); }} 로그인 URL을 설정하고 로그인 후 점프하는 URL 및 로그 아웃 후 점프하는 URL을 설정하여 기본 구성 만 수행됩니다. 주석을 사용하여 @enableglobalmethodsecurity (prepostenabled = true)를 사용하면 보안 주석이 가능합니다. 제어 권한이 필요한 메소드에서 @preauthorize 및 @prefilter를 사용할 수 있습니다.
3. 사용자 정의 userDetailService
공개 클래스 CustomUserDetailsService는 userDetailsService를 구현합니다. @override public userDetails loadUserByUserName (String username)은 usernamenotfoundexception {// suser는 데이터베이스의 사용자 테이블에 해당합니다.이 예제는 사용자 이름으로 사용자와 비밀번호를 저장하는 테이블입니다. if (user == null) {새 userernamenotfoundException ( "username" + username + "found"); } // SecurityUser는 사용자 데일을 구현하고 Suser의 이메일을 사용자 이름으로 보내는 SecurityUser = 새로운 SecurityUser (user); 컬렉션 <SimpleGrantEdauthority> 당국 = New ArrayList <SimpleGrantEdauthority> (); 당국 .add (New SimplegrantEdauthority ( "role_admin")); 반품 보안 요소; }}여기서는 userDetailsService 인터페이스 만 구현하고 LoadUserByUserName 메소드를 다시 작성하고 데이터베이스에서 사용자 정보를 검색하면됩니다. 마지막으로, userDetails 구현 클래스가 반환됩니다.
4. 오류 처리 구성을 정의합니다
@ConfigurationPublic Class ErrorPageConfig {@bean public embeddedservletcontainercustomizer embeddedservletcontainercustomizer () {return new myCustomizer (); } 개인 정적 클래스 MyCustomizer는 EmbeddedServletContainerCustomizer {@override public void Customize (configurableEmbeddedServletContainer 컨테이너) {컨테이너 adderrorpages (new ErrorPage (httpstatus.forbidden, "/403"); }}}액세스 오류가 발생하면 "/403"으로 이동하십시오.
5. 컨트롤러 인터페이스
@ControllerPublic Class IndexController {@Resource private suserService suserservice; @requestmapping ( "/home") public string home () {return "home"; } @preauthorize ( "hasrole ( 'user')") @requestMapping (value = "/admin", method = requestMethod.get) public String toadmin () {return "helloadmin"; } @requestmapping ( "/hello") public String hello () {return "Hello"; } @requestmapping ( "/login") public String login () {return "login"; } @requestmapping ( "/") public String root () {return "index"; } @requestmapping ( "/403") public String error () {return "403"; }}@preauthorize ( "hasrole ( 'user')")은 Toadmin () 메소드에서 사용 되므로이 메소드에 액세스하려면 사용자 역할이 필요함을 나타냅니다. 권한 레벨을 제어하려면 @preauthorize ( "haspermission ()")를 사용할 수 있습니다. 이것은 사용 중 하나 일뿐입니다. 더 많은 사용법을 보려면 공식 문서를 읽을 수 있습니다. 스프링 보안의 기본 역할 접두사는 "역할 _"이며, 해산 방법을 사용할 때 기본적으로 추가되었습니다. 따라서 데이터베이스에서의 사용자 역할은 "role_user"여야하며, 사용자 앞에 사용자 접두사 "role_"가 추가됩니다.
6. 테스트
프로젝트를 시작하고 http : // localhost : 1130/login을 방문하십시오
로그인하고 "/hello"를 입력하려면 클릭하십시오.
관리자 페이지로 이동하려면 클릭하십시오
"사용자"메소드에 해당하는 백그라운드 "/admin"URL에서 사용자는 "사용자"역할이 있어야합니다. 로그인 한 사용자는이 역할을 수행하기 위해 데이터베이스에 설정되어 있습니다.
이제 데이터베이스에서 사용자 역할을 수정하고 "role_admin"으로 변경합니다. 로그 아웃 후 다시 로그인하면 "Administrator Page로 이동"버튼을 다시 클릭하면 다음 페이지로 이동합니다.
현재 "사용자"권한이 없기 때문에 액세스 중에 예외가 발생했으며 "/403"으로 가로 채서 리디렉션되었습니다.
7. 액세스 후, 오류 코드 403
먼저 "/admin"을 변경하여 요청을 게시합니다
@preauthorize ( "hasrole ( 'user')") @requestmapping (value = "/admin", method = requestmethod.post) public String toadmin () {return "heloadmin"; }원래 양식 표현식에서 "관리자 페이지로 이동"버튼의 요청 메소드를 변경하여 Ajax 게시물 제출에 제출됩니다. 양식 게시물을 사용하여 제출되지 않은 이유는 나중에 그것에 대해 이야기 할 것입니다. 먼저 코드를 수정하십시오
<body> <h1 th : inline = "text"> hello [[$ {#httpservletrequest.remoteuser}]! </h1> <!-<form th : action = "@{/logout}"method = "post"> <input type = "value ="sign out "/> <form th : action ="@inder} "} typ : type = "value ="value = "관리자 페이지로 이동"/> </form>-> <a th : href = "@{/admin}"rel = "external nofollow"> 관리자 페이지로 이동 </a> <입력 = "onclick ="testpost () "th : valueator page"</body page " $ .ajax ({url : "/admin", type : 'post', success : function (data) {}}); } </스크립트> "관리자 페이지로 이동"버튼을 클릭하면 디버깅 플랫폼에서 다음을 볼 수 있습니다.
이는 프레임 워크가 CSRF (크로스 사이트 요청 위조 크로스 사이트 요청 위조)가 발생하는 것을 방지하여 GET를 제외한 대부분의 방법을 제한하기 때문입니다.
다음은 해결책입니다.
먼저 태그에 다음 내용을 추가하십시오.
<meta name = "_ csrf"th : content = "$ {_ csrf.token}"/> <meta name = "_ csrf_hader"th : content = "$ {_ csrf.headername}"/> 이 토큰이 추가되는 한 배경은이 토큰의 정확성을 확인합니다. 정확한 경우 사후 액세스를 허용합니다.
그런 다음 Ajax 코드에 다음 코드를 추가하십시오.
var token = $ ( 'meta [name = "_ csrf"]'). attr ( "content"); var header = $ ( 'meta [name = "_ csrf_hader"]]. att ( "content"); $ (문서).
이러한 방식으로 Post, Delete 및 기타 방법을 사용하여 일반적으로 액세스 할 수 있습니다.
위에서 언급 한 포스트 양식 제출 방법을 사용하여. 페이지의 소스 코드를 볼 수 있습니다.
프레임 워크는 숨겨진 필드를 양식 양식에 자동으로 삽입하고 값 값은 토큰이므로 양식 양식을 사용하여 게시물 요청을 제출할 수 있으며 AJAX 방식으로 제출하면 해당 코드를 추가해야합니다.
좋아, 그게이 기사에 관한 모든 것입니다. 나중에 나중에 Spring Security를 사용하여 나머지 API 스타일의 권한을 제어하는 방법에 대한 기사가 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.