스프링 보안 기본 소개
여기서는 Spring Security에 대해 너무 많은 소개를하지 않을 것입니다. 자세한 내용은 공식 문서를 참조하십시오.
나는 Springsecurity의 핵심 기능에 대해서만 이야기 할 것입니다.
기본 환경 구성
여기서 우리는 SpringBoot를 프로젝트의 기본 프레임 워크로 사용합니다. 패키지 관리에 Maven 방법을 사용하고 있으므로 먼저 스프링 보안을 통합하는 방법을 제공합니다.
<pectinements> ... <pectionency> <groupId> org.springframework.boot </groupid> <artifactid> Spring-Boot-Starter-Security </artifactid> </dependency> ... </dependencies>
그런 다음 웹 계층 요청 인터페이스를 설정하십시오
@restController @requestMapping ( "/User") public class userController {@getMapping public String getUsers () {return "Hello Spring Security"; }}다음으로 프로젝트를 직접 실행하고 인터페이스를 호출하여 효과를 확인할 수 있습니다.
웹 페이지를 통해 호출
먼저 브라우저를 통해 인터페이스 호출을하고 http : // localhost : 8080/user에 직접 액세스합니다. 인터페이스에 정상적으로 액세스 할 수 있다면 "Hello Spring Security"를 표시해야합니다.
그러나 우리는 정상적으로 액세스 할 수 없으며 아래 그림의 인증 입력 상자가 나타납니다.
SpringBoot에서는 기본 스프링 보안이 효과적이기 때문입니다. 현재 인터페이스가 보호되며 검증을 전달하여 정상적으로 액세스해야합니다. Spring Security는 기본 사용자를 제공하고 사용자 이름은 사용자이며 프로젝트가 시작될 때 비밀번호가 자동으로 생성됩니다.
프로젝트 시작 로그를 확인하면 다음 로그를 찾을 수 있습니다.
기본 보안 비밀번호 사용 : 62CCF9CA-9FBE-4993-8566-8468CC33C28C
물론, 당신이 보는 비밀번호는 내 것과는 달라야합니다. 시작 로그에서 사용자 및 비밀번호로 직접 로그인합니다.
성공적으로 로그인 한 후에는 인터페이스를 정상적으로 호출하는 페이지로 이동합니다.
처음부터 스프링 보안을 활성화하지 않으려면 구성 파일에서 다음을 구성 할 수 있습니다.
# 보안 활성화 보안 .basic.enabled = false
내가 방금 본 로그인 상자는 Springsecurity에서 제공했으며, 이는 httpbasiclogin이라고합니다. 그것은 우리가 우리의 제품에서 원하는 것이 아닙니다. 우리의 프론트 엔드는 일반적으로 양식 제출을 통해 사용자 로그인 검증을 수행하므로 자체 인증 로직을 사용자 정의해야합니다.
사용자 인증 로직을 사용자 정의합니다
각 시스템에는 고유 한 사용자 시스템 세트가 있어야하므로 자체 인증 로직 및 로그인 인터페이스를 사용자 정의해야합니다.
여기서 우리는 그에 따라 Springsecurity를 구성해야합니다
@ConfigurationPublic Class BrowersecurityConfig는 WebsecurityConfigurerAdapter {@override Protected Void Configure (httpsecurity http)를 예외 {http.formlogin () // 사용자가 로그인해야 할 때 전송할 때 .AND (). 보호되고 보호 될 필요가 없습니다. }}다음으로, 사용자 인증 로직을 구성하십시오. 자체 사용자 시스템이 있으므로.
@ComponentPublic Class MyUserDetailsService 구현 userDetailsService {private logger = loggerfactory.getLogger (getClass ()); @override public userDetails loadUserByUserName (String username)은 usernamenotfoundexception {logger.info ( "사용자의 사용자 이름 : {}", username); // 사용자 이름에 따라 TODO, 해당 비밀번호를 찾고 사용자 정보를 캡슐화하고 반환하십시오. 매개 변수는 다음과 같습니다. 사용자 이름, 암호, 사용자 권한 사용자 user = 새 사용자 (사용자 이름, "123456", visoantiparatedStringtoAuthorityList ( "admin")); 리턴 사용자; }} 우리는 여기서 너무 많은 검증을 수행하지 않았습니다. 사용자 이름은 마음대로 작성 될 수 있지만 암호는 "123456"이어야하여 성공적으로 로그인 할 수 있어야합니다.
동시에, 여기서 사용자 객체의 세 번째 매개 변수가 현재 사용자의 권한을 나타내며 "admin"으로 설정 함을 알 수 있습니다.
프로그램을 실행하여 테스트하면 로그인 인터페이스가 변경되었음을 알 수 있습니다.
구성 파일에서 http.formLogin() 구성했기 때문입니다.
여기에 사용자를 작성한 다음 잘못된 (123456) 버전을 작성해 봅시다. 확인 오류가 발생합니다.
동시에, 콘솔에서 로그인 할 때 방금 채운 사용자도 인쇄됩니다.
이제 올바른 비밀번호로 로그인 해 보겠습니다. 확인을 전달하고 올바른 인터페이스 호출 페이지로 이동할 수 있습니다.
userDetails
바로 지금, 우리가 MyUserDetailsService 작성할 때, 우리는 메소드를 구현하고 UserDetails 반환했습니다. 이 userDetails는 7 가지 방법을 포함하는 사용자 정보를 캡슐화하는 객체입니다.
공개 인터페이스 userDetails는 직렬화 가능 {// 캡슐화 된 권한 정보 수집 <? getedauthority> getAuthorities ()를 확장합니다. // 비밀번호 정보 문자열 getPassword (); // 로그인 사용자 이름 문자열 getUserName (); // 계정이 만료되는지 부울 isaccountnonexpired (); // 계정이 Frozen Boolean isaccountnonlocked ()인지 여부; // 계정 비밀번호가 만료되는지 여부는 일반적으로 비밀번호 요구 사항이 높은 일부 시스템에서 사용됩니다. 사용자와 비교하여 가끔씩 비밀번호를 매번 재설정해야합니다. 부울 iscredentialsnonexpired (); // 계정을 사용할 수 있습니까? 부울 isenabled ();}userDetails 구현 클래스 사용자를 반환하면 사용자 생성자 메소드를 통해 해당 매개 변수를 설정할 수 있습니다.
암호 암호화 및 암호 해독
Springsecurity에는 PasswordEncoder 인터페이스가 있습니다
public Interface passwordencoder {// 암호를 암호화합니다. // 부울 일치에 맞는 비밀번호 결정 (charSequence var1, String var2);} 이 인터페이스를 직접 구현하고 구성 파일에서 구성하면됩니다.
기본적으로 제공된 구현 클래스로 일시적으로 테스트하겠습니다.
// browersecurityconfig @BeanPublic passwordEncoder passwordEncoder () {return new bcryptpasswordencoder (); }암호화 사용 :
@ComponentPublic Class MyUserDetailsService 구현 userDetailsService {private logger = loggerfactory.getLogger (getClass ()); @autowired private passwordencoder passwordencoder; @override public userDetails loadUserByUserName (String username)은 usernamenotfoundexception {logger.info ( "사용자의 사용자 이름 : {}", username); 문자열 암호 = passwordencoder.encode ( "123456"); logger.info ( "비밀번호 : {}", 비밀번호); // 매개 변수는 다음과 같습니다. 사용자 이름, 비밀번호, 사용자 권한 사용자 사용자 = 새 사용자 (사용자 이름, 암호, pocustionUtils.commasEparatedStringToHuthorityList ( "admin")); 리턴 사용자; }}여기서 우리는 단순히 123456을 암호화합니다. 테스트를 수행하고 매번 인쇄 된 암호가 다르다는 것을 알 수 있습니다. 이것은 구성된 bcryptpasswordencoder의 역할입니다.
개인화 된 사용자 인증 로직
사용자 정의 로그인 페이지
이전 테스트에서는 기본 로그인 인터페이스가 항상 사용되었습니다. 각 제품에는 자체 로그인 인터페이스 디자인이 있다고 생각 하므로이 섹션에서 로그인 페이지를 사용자 정의하는 방법에 대해 배울 것입니다.
간단한 로그인 페이지를 먼저 쓰자
<! docType html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> 로그인 페이지 </title> </head> <hod> <h2> 사용자 정의 로그인 페이지 </h2> <양식 action = "/user/login"method = "post"> <tr> <td> <td> username : username : <td> username : type = "text"name = "username"> </td> </td> <td> <td> 비밀번호 : </td> <td> <입력 유형 = "password"name = "password"> </td> </tr> <tr> <td colspan = "2"> <button type = "login"> button> </tab> </table> </form> </body> </html>
로그인 페이지를 완료하면 Springsecurity를 위해 구성해야합니다.
// browersecurityconfig.java@overrideprotected void configure (httpsecurity http)는 예외를 던져 {http.formlogin () // 사용자가 로그인해야 할 때 전송할 로그인 페이지를 정의합니다. .LoginPage ( "/login.html"). page.loginProcessingUrl ( "/user/login") // 사용자 정의 로그인 인터페이스. 및 () .authorizeRequests () // 보호해야 할 URL을 정의하고 보호해야 할 URL을 정의하십시오. 항공기 ( "/login.html"). logmitall ()에 액세스하도록 설정하십시오. .authenticated (). and () .csrf (). disable (); // CSRF 보호 끄기}이런 식으로 보호 된 인터페이스에 액세스 할 때마다 로그인 .html 페이지로 전송됩니다.
다른 유형의 요청을 처리합니다
이제 전면 및 후면이 일반적으로 분리되기 때문에 백엔드는 프론트 엔드에 대한 인터페이스를 제공하고 JSON 형식 데이터를 프론트 엔드로 반환합니다. 이전과 마찬가지로 보호 인터페이스가 호출되고 페이지 점프가 직접 리디렉션되었습니다. 웹 쪽에서는 허용되지만 앱 측에서는 불가능하므로 추가 처리를 수행해야합니다.
여기에 간단한 아이디어가 분류됩니다
먼저, 사용자 정의 컨트롤러를 작성하고 ID 인증이 필요할 때 점프하십시오.
@RestControllerPublic Class BrowserseRecurityController {private logger = loggerfactory.getLogger (getClass ()); // 원래 요청 정보의 캐싱 및 복구 개인 요청 CACHE requestCache = 새로운 httpsessessionRequestCache (); // 개인 리디렉션 스트레이트 리드 리디렉션 스트레이트 리그를 리디렉션하는 데 사용됩니다. /** * ID 인증이 필요할 때 * @param request * @param response * @return */@requestmapping ( "/authentication/requestmapping") @ResponSestatus (code = httpstatus.unauthorized) public asurethenication (httpservletrequest request, httpservletr response) io exemplement SavedRequest = requestCache.getRequest (요청, 응답); if (savedRequest! = null) {String targeturl = savedRequest.getRedirectUrl (); logger.info ( "점프를 트리거하라는 요청은" + targeturl); if (stringUtils.endswitHignoreCase (targeturl, ".html")) {redirectStrategy.sendRedirect (요청, 응답, "/login.html"); }} 새로운 BaserPonse를 반환합니다 ( "액세스 서비스에는 신원 인증이 필요합니다. 사용자를 로그인 페이지로 안내하십시오"); }}물론 구성 파일을 그에 따라 수정해야하므로 여기에 코드를 게시하지 않습니다. 인터페이스를 여는 것입니다.
확장 :
여기에 웹 페이지에서 액세스하는 인터페이스를 작성한 다음 "/login.html"페이지로 이동합니다. 실제로, 우리는 그것을 확장하고 점프 주소를 구성 파일로 구성 할 수 있습니다. 이는 더 편리합니다.
사용자 정의 처리 로그인 성공/실패
이전 테스트에서는 성공적인 로그인 후 페이지 리디렉션이 수행되었습니다.
전면 및 후면 끝이 분리 된 경우 성공적으로 로그인하면 직접 점프하는 대신 사용자의 개인 정보를 프론트 엔드로 반환해야 할 수도 있습니다. 로그인 실패도 마찬가지입니다.
여기에는 Spring Security AuthenticationSuccessHandler 및 AuthenticationFailureHandler 의 두 인터페이스가 포함됩니다. 이 인터페이스를 구현하고 그에 따라 구성 할 수 있습니다. 물론 프레임 워크에는 기본 구현 클래스가 있습니다. 이 구현 클래스를 상속하고 비즈니스를 사용자 정의 할 수 있습니다.
@component ( "myauthenctiationsuccesshandler") public class myauthenctiationsuccesshandler는 simpleurlauthenticationsuccesshandler {private logger = loggerfactory.getLogger (getClass ()); @autowired 개인 ObjectMapper ObjectMapper; @override public void onauthenticationSuccess (httpservletrequest request, httpservletreponse 응답, 인증 인증)는 ioexception, servletexception {logger.info ( "로그인"); Response.SetContentType ( "Application/JSON; charSet = UTF-8"); response.getWriter (). 쓰기 (ObjectMapper.writeValueAsString (Authentication)); }} 여기서 우리는 응답을 통해 JSON 문자열을 반환합니다.
이 방법의 세 번째 매개 변수 인 Authentication 에는 로그인 사용자 정보 (userDetails), 세션 정보, 로그인 정보 등이 포함됩니다.
@Component ( "myAuthenctiationFailureHandler") public class myauthenctiationFailureHandler 확장 SimpleUrlauthenticationFailureHandler {private logger = loggerFactory.getLogger (getClass ()); @autowired 개인 ObjectMapper ObjectMapper; @override public void onauthenticationFailure (httpservletrequest 요청, httpservletreponse 응답, AuthenticationException Exception)는 ioexception, servletexception {logger.info ( "로그인 실패"); response.setstatus (httpstatus.internal_server_error.value ()); Response.SetContentType ( "Application/JSON; charSet = UTF-8"); response.getWriter (). 쓰기 (ObjectMapper.writeValueAsString (New BaserPonse (Exception.GetMessage ())); }} 이 방법의 세 번째 매개 변수 인 AuthenticationException 에는 로그인 실패에 대한 정보가 포함되어 있습니다.
마찬가지로 구성 파일에서 구성해야합니다. 여기에 모든 코드를 게시하지 않으며 해당 문 만 게시됩니다.
.successhandler (myauthenticationsuccesshandler) // 사용자 정의 로그인이 성공적으로 핸들을 핸들링합니다 .failureHandler (myAuthenticationFailureHandler) // 사용자 정의 로그인 실패 핸들
암호
완전한 코드를 보려면 저를 클릭 할 수 있습니다
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.