봄 보안 (四)

수요의 처음 세 장은 아래의 요구 사항을 완료하기 위해 종이에 직접, 세부 사항으로하지 않습니다

  1. 이 사이트는 가정, 사용자 페이지, 부서 페이지 1, 2 개 페이지 부서, 관리 페이지 및 로그인 페이지로 나누어 져 있습니다;
  2. 로그인 사용자 이름과 비밀번호 오류 로그인 오류를 사용;
  3. 세 가지 측면에서 처음 세 장 사용자 : 2) 상기 필터를 우회하여 해커 알렉스 1) 사용자 메모리 사용자 관리 3), 및 사용자 데이터베이스 (5)는 () 데이터베이스의 데이터를 참조
  4. 다른 사용자는 서로 다른 권한을 다른 페이지에 액세스 할 수있는 다른 권한이;
  5. 로그인 페이지는 권한이 필요하지 않습니다;
  6. 사용자 문서 사용자 권한이 필요하며 관리자 페이지는 관리자 권한이 필요 섹터 1 페이지 USER1 또는 관리자 권한을 필요 섹터 2 페이지 USER2 또는 관리자 권한이 필요합니다;
  7. 사용자가 로그인하지 않은 경우 자동으로 로그인 페이지를 이동, 당신은 액세스 페이지에 대한 권한이 필요합니다;
  8. 사용자가 로그인 한 경우, 페이지가 서버가 반환에게 JSON에 액세스 할 권리, 사용자를 말하는 것은 액세스 페이지로 권한이없는이 없습니다

1. 인증 원리

처음 세 개의 챕터가 도입 된, 봄 Securtiy 두 기능을 확인하고 인증 할 수 있습니다. 인증은 사용자가 시스템에 로그인 할 수 있도록 사용자의 신원을 검증합니다. 이 검증 프로세스는 체인 AuthenticationProvider에 일련의 완료됩니다. 인증이 성공하면, 사용자 ID는 또한 ROLE_USER 또는 ROLE_ADMIN와 같은 역할을 가지고 있습니다, 확인.

인증은 사용자가 자원에 대한 액세스를 갖는 일련의 처리 여부를 결정하는 것이다. 예를 들어이 문서에, 우리는 필요한 저장 myauthorization.resource 역할 및 자원에 대한 데이터베이스 테이블을 사용합니다. 예 / depart2 / ** 자원의 경우, 필요에 ROLE_ADMIN, ROLE_MANAGER하는 ROLE_DEPART2있는이 세 가지 역할. (가) 로그인 한 사용자 만약 그렇지 않으면, AccessDeniedException을 던질 예외 처리기를 입력합니다, 액세스 원활하게 할 수있는, 이러한 자원 중 하나입니다.

다음 코드는 인증 프로세스에 대한 인증 프로세스에 따라 다시 작성해야합니다 :

1. 사용자가 로그인하지 않은 경우, 로그인 페이지를 이동하고 로그인하려고합니다 필요한 자원의 액세스 권한;

사용자 로그인이 성공하면 2, 그는 역할의 일련의 것입니다.

사용자가이 클래스의 자원 / XXX, FilterInvocationSecurityMetadataSource 실현 (이 문서 MySecurityMetadataSource이다)에 액세스하는 경우 3. getAttributes 자원 매칭 접근 부른다. 그것은 / XXX 경기에서 데이터베이스 테이블 자원의 모든 레코드를 읽습니다. 경기가 성공하면 / XXX에 해당하는 역할에 컬렉션 <ConfigAttribute> 반환에 필요한 다음, 일치에 실패 / XXX 추가 액세스를 필요로하지 않는다;

4. 프로세스는 방법은 현재 사용자가 액세스 할 수 자원 여부를 결정할 수를 결정하는 인증 결정하는 AccessDecisionManager 클래스 구현 클래스 (MyAccessDecisionManager)에왔다. 매개 변수, 방법은 현재 사용자의 인증 정보를 얻을 수 3 단계에 필요한 역할 정보에서 얻은 자원을 결정, 당신이 결정할 수 이러한 역할에 일치하는 정보를 제공하는 인증 여부. 물론, 당신은 또한 긴 사용자가 모든 ROLE_ADMIN 자료에 역할을 한 예를 들어, 결정하기위한 그들 만의 독특한 방법을 추가 할 수 있습니다;

5. 인증이 성공하면, 사용자가 성공적 페이지에 액세스은, 그렇지 않으면 AccessDeniedHandler 구현 클래스 (MyAccessDeniedHandler를) 처리됩니다 AccessDeniedException 방법 예외가 던져 질을 결정합니다. 단지 JSON 객체가 클라이언트에 문자열의 뒷면에 변환되어 생성된다.

2. 코드 설명

1. 먼저, 용지가 여전히 단일 테이블 구조 데이터베이스 설계 데이터베이스 테이블의 문제가 사용되며,이 필드의 역할은 다음과 콤마 두 테이블에서 분리하고 개척 프로그램을 해제이다 :

- ---------------------------- 
- 테이블 구조 에 대한 `user`
 - ---------- ------------------ 
DROP TABLE IF는`user` 존재; 
(표`user`을 만들 
  id` BIGINT (` 20 ) NOT NULL AUTO_INCREMENT는 
  `name` VARCHAR ( 32 ) DEFAULT의 NULL의 COMMENT ' 姓名' , 
  `address` VARCHAR를 ( 64 ) DEFAULT NULL의 COMMENT ' 联系地址' , 
  `username` VARCHAR ( 255 )의 SET CHARACTER utf8mb4 부씩 utf8mb4_bin시 기본 NULL 주석 ' 账号' , 
  `password` VARCHAR ( 255DEFAULT의 NULL 주석 utf8mb4_bin) 문자 세트 utf8mb4 부씩 ' 密码' , 
  `roles` VARCHAR ( 255 DEFAULT의 NULL 주석 utf8mb4_bin) CHARACTER SET의 utf8mb4 부씩 ' 角色' , 
  PRIMARY KEY (`id`) 
) ENGINE = 이노 AUTO_INCREMENT = 3 DEFAULT CHARSET = UTF8 ;
- ---------------------------- 
-   `user`의 기록
 - ----------- ----------------- 
BEGIN; 
INSERT INTO`user`의 VALUES ( ' 1 ' , ' 아담 ' , ' 베이징 ' ,' 아담 ' , ' $ 2A $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' , ' ROLE_USER ' ); 
INSERT INTO는`user`의 VALUES ( ' 2 ' , ' 수퍼을 ' , ' shanghang " , " " , " $ 2A $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' , ' ROLE_USER, ROLE_ADMIN ' ); 
INSERT INTO`user`의 VALUES ( ' 3 ' , '' , ' 베이징 ' , ' 관리자 ' , ' $ 2A $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' , ' ROLE_USER, ROLE_MANAGER ' ); 
INSERT INTO`user`의 VALUES ( ' 4 ' , ' 사용자 1 ' , ' shanghang ' , ' 사용자 1 ' , ' $ 2A $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' , ' ROLE_USER, ROLE_DEPART1 ' );' 5 ' , ' 사용자 2 ' , ' shanghang ' , ' USER2 ' , ' $ 2A $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' , ' ROLE_USER, ROLE_DEPART2 ' ); 
범하다; 

- ---------------------------- 
- 테이블 구조 에 대한 `resource`
 - ---------- ------------------ 
DROP TABLE IF는`resource` 존재; 
표`resource`를 CREATE ( 
  `id` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT,  
  (`url` VARCHAR를255 ) DEFAULT의 NULL의 COMMENT '资源' , 
  `roles` VARCHAR ( 255 ) DEFAULT NULL 주석 ' 所需角色' , 
  PRIMARY KEY (`id`) 
) ENGINE = 이노 AUTO_INCREMENT = 3 DEFAULT CHARSET = UTF8;
- ---------------------------- 
-   `resource`의 기록
 - ----------- ----------------- 
BEGIN; 
INSERT INTO`resource` VALUES ( ' 1 ' , ' / depart1 / ** ' , ' ROLE_ADMIN, ROLE_MANAGER, ROLE_DEPART1 ' );
INSERT INTO`resource` VALUES ( ' 2 '  ,' / depart2 / ** ' , ' ROLE_ADMIN, ROLE_MANAGER, ROLE_DEPART2 ' ); 
INSERT INTO`resource` VALUES ( ' 3 ' , ' / 사용자 / ** ' , ' ROLE_ADMIN, ROLE_USER ' ); 
INSERT INTO`resource` VALUES ( ' 4 ' , ' / 관리 / ** ' , ' ROLE_ADMIN ' ); 
범하다;

다음과 같이 통합 된 현재 온라인 기사, JavaConfig 사용하는 하나의 방법, withObjectPostProcessor 방법, 즉 사용을 설정하는 방법에 문제 WebSecurityConfigurerAdapter에 FilterInvocationSecurityMetadataSource 클래스 (안전 메타 데이터 소스 클래스)에 대해 2 :

@EnableWebSecurity
 공공  클래스 SecurityConfiguration는 WebSecurityConfigurerAdapter {확장 
    @Autowired 
    BackdoorAuthenticationProvider backdoorAuthenticationProvider는; 
    @Autowired 
    MyUserDetailsService myUserDetailsService; 
    @Autowired 
    MyAccessDecisionManager myAccessDecisionManager; 
    @Autowired 
    MySecurityMetadataSource mySecurityMetadataSource; 
    @Autowired 
    MyAccessDeniedHandler myAccessDeniedHandler; 

...省略
    @Override가 
    보호  무효 구성은 (HttpSecurity HTTP) 예외를 throw { 
        HTTP 
                .authorizeRequests ()
                .withObjectPostProcessor ( 새로운 ObjectPostProcessor <FilterSecurityInterceptor를> () { 
                    @Override의 
                    공중 O 후 처리 (O <O는 FilterSecurityInterceptor를 연장> 객체 ) {
                         오브젝트 .setSecurityMetadataSource (mySecurityMetadataSource)
                         객체 .setAccessDecisionManager (myAccessDecisionManager)
                         복귀  개체 ; 
                    } 
                }) 
   ...省略
3. AccessDecisionManager가이 인증 판정 클래스 WebSecurityConfigurerAdapter 두 가지 방법이있다 제공 하나는 전술 된 바와 같은 방법, 다른이다
HTTP 
                .authorizeRequests (). AccessDecisionManager가 (myAccessDecisionManager)

4. MyAccessDeniedHandler은 여기에 단순히 JSON 문자열 클래스를 반환합니다. 당신이 AccessDeniedException을 처리하지 않으면 403 에러 페이지가 표시됩니다. 여기에서 반환 된 문자열과 프론트 엔드는 부유 한 페이지를 표시하기 위해 결합 될 수있다.


3. 요약

기사의 다른 입문 온라인 인증에서 종종 언급 봄 보안 세 AccessDecisionManager가 클래스 기반의 투표를 달성 내장, 그들은 AffirmativeBased, ConsensusBased 및 UnanimousBased입니다. 그런 다음 클래스 투표를 구현하는 방법에 대해 설명합니다. 하지만 직접 후계자 AccessDecisionManager가, 그때 쉽게 방법을 결정할 다시 생각합니다.

추천

출처www.cnblogs.com/xc-xinxue/p/12500853.html