Shiro 프로필 과 Quickstart

7670 단어 권한 관리
Shiro 안전 프레임 워 크
Apache Shiro 는 강력 하고 사용 하기 쉬 운 자바 보안 프레임 워 크 로 인증,권한 수여,암호 화,세 션 관리,웹 통합,캐 시 등 을 수행 합 니 다.스프링 시 큐 리 티 에 비해 스프링 시 큐 리 티 가 하 는 기능 이 강하 지 않 을 수도 있 습 니 다.Shiro 는 자바 SE 환경 뿐만 아니 라 자바 EE 환경 에 도 사용 할 수 있 는 충분 한 응용 프로그램 을 쉽게 개발 할 수 있다.
기능 점:
Authentication:     /   ,              ;
Authorization:  ,     ,                  ;           ,    :              。                         ;
Session Management:    ,            ,       ,           ;        JavaSE    ,      Web    ;
Cryptography:  ,        ,           ,       ;
Web Support:Web   ,           Web   ;
Caching:  ,       ,     、      /         ,        ;
Concurrency:shiro             ,               ,          ;
Testing:      ;
Run As:              (      )       ;
Remember Me:   ,          ,      ,           。

Shiro 3 대 핵심 구성 요소
       Subject:즉"현재 작업 사용자"입 니 다.그러나 Shiro 에서 Subject 라 는 개념 은 사람 을 가리 키 는 것 이 아니 라 제3자 프로 세 스,백 스테이지 계 정(Daemon Account)또는 다른 유사 한 것 일 수도 있다.그것 은 단지'현재 소프트웨어 와 상호작용 하 는 것'을 의미 할 뿐이다.Subject 는 현재 사용자 의 안전 조작 을 대표 하고 모든 Subject 는 Security Manager 에 연결 되 며 Security Manager 는 모든 사용자 의 안전 조작 을 관리 합 니 다.Security Manager:보안 관리 자 는 Shiro 프레임 워 크 의 핵심 입 니 다.Shiro 는 Security Manager 를 통 해 내부 구성 요소 인 스 턴 스 를 관리 하고 이 를 통 해 안전 관리의 각종 서 비 스 를 제공 합 니 다.Realm:Realm 은 Shiro 와 응용 안전 데이터 간 의'교량'또는'연결기'역할 을 합 니 다.사용자 에 대한 인증(로그 인)과 권한 수여(액세스 제어)검증 이 실 행 될 때 Shiro 는 설 정 된 Realm 에서 사용자 와 권한 정 보 를 찾 는 것 이다.그런 의미 에서 Realm 은 실질 적 으로 안전 과 관련 된 DAO 입 니 다.데이터 원본 의 연결 디 테 일 을 봉인 하고 필요 할 때 관련 데 이 터 를 Shiro 에 제공 합 니 다.Shiro 를 설정 할 때 인증 과(또는)인증 에 사용 할 Realm 을 최소한 지정 해 야 합 니 다.여러 개의 Realm 을 설정 하 는 것 은 가능 하지만,적어도 하나 가 필요 합 니 다.
인증
shiro 에서 사용 자 는 principals(신분)와 credentials(증명)를 shiro 에 제공 하여 사용자 의 신분 을 검증 할 수 있 습 니 다.

인증
:일반적으로 신분 ID 등 일부 표지 정 보 를 제공 하여 로그 인 자의 신분 을 나타 내야 합 니 다.예 를 들 어 email 을 제공 하 는 경우,
사용자 이름/비밀번호
증명 하 러 왔 습 니 다.
       
shiro 에서 사용 자 는 제공 해 야 합 니 다.
principals(신분)와 credentials(증)
번 하 다
shiro 에 사용자 인증 을 적용 합 니 다.

principals
신분
주체 의 표식 속성
,모든 속성 일 수 있 습 니 다.
사용자 이름
메 일 박스 등 유일 하면 됩 니 다.
。하나의 주 체 는 여러 개의 principals 가 있 을 수 있 지만,
단 하나
Primary principals
보통 사용자 이름/메 일/핸드폰 번호 입 니 다.

credentials

증명
암호/디지털 인증서 등 주체 만 아 는 보안 값 입 니 다.
 

가장 흔 한 principals 와 credentials 의 조합 은
사용자 이름/비밀번호
자,외 두 가지 관련 개념 은 전에 언급 한 것 이다. 
Subject 미치다 
Realm,각각 주체 및 검증 주체 의 데이터 원본
 
권한 을 부여 하 다
권한 을 부여 하 다
부르다
접근 제어,즉 응용 프로그램 에서 누가 어떤 자원 에 접근 하 는 지 제어 하 는 것 입 니 다.
(예 를 들 어 페이지 방문/데이터 편집/페이지 작업 등).권한 수여 에서 알 아야 할 몇 가지 관건 적 인 대상:주체(Subject),자원(Resource),권한(Permission),역할(Role).
 
      1、 
주체(제목):
응용 프로그램 에 접근 한 사용자,Shiro 에서 사용
Subject
이 사용 자 를 대표 합 니 다.사용 자 는 권한 을 수 여 받 은 후에 만 해당 하 는 자원 에 접근 할 수 있 습 니 다.
      2.자원(자원):
응용 프로그램 에서 사용자 가 접근 할 수 있 는 URL
,예 를 들 어 JSP 페이지 방문,일부 데이터 보기/편집,특정한 업무 방법 방문,텍스트 인쇄 등 은 모두 자원 입 니 다.사용 자 는 권한 을 부여 해야만 접근 할 수 있다.
      3.권한(Permission):
안전 정책 중의 원자 권한 수여 단 위 는 권한 을 통 해 우 리 는 응용 에서 사용자 가 특정한 자원 을 조작 할 권리 가 있 는 지 를 나 타 낼 수 있다.즉시
권한 은 응용 프로그램 에서 사용자 가 특정한 자원 에 접근 할 수 있 는 지 를 표시 합 니 다.
예 를 들 어 사용자 목록 페이지 를 방문 하여 사용자 데 이 터 를 조회/추가/수정/삭제(즉,CRUD(추가 검사 및 삭제)식 권한 제어)하 는 경우 가 많 습 니 다.권한 은 사용자 가 특정한 자원 을 조작 할 권리 가 있 는 지,즉 특정한 자원 에 반 영 된 조작 이 허용 되 지 않 는 지 를 나타 낸다.
      4.캐릭터(역할)

권한 집합
일반적으로 사용자 에 게 권한 이 아 닌 역할 을 부여 합 니 다.즉,사용자 가 한 그룹의 권한 을 가 질 수 있 고 권한 을 부여 할 때 편리 합 니 다.전형 적 인 예 를 들 어 프로젝트 매니저,기술 총감독,CTO,개발 엔지니어 등 은 모두 역할 이 고 서로 다른 역할 은 서로 다른 권한 을 가진다.
 
Quickstart 
shrio.ini
[users]#  =  ,  
root = secret, admin  
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz


[roles]#  =  (       )
admin = *
schwartz = lightsaber:*
goodguy = user:delete:zhangsan

 
public class Quickstart {

    private static final transient Logger log = LoggerFactory.getLogger(Quickstart.class);

    public static void main(String[] args) {

		//  shrio   securityManager
        Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);

        //  subject
        Subject currentUser = SecurityUtils.getSubject();

        //  session
        Session session = currentUser.getSession();
        session.setAttribute("someKey", "aValue");
        String value = (String) session.getAttribute("someKey");
        if (value.equals("aValue")) {
            log.info("---> Retrieved the correct value! [" + value + "]");
        }

        //            ,     
        if (!currentUser.isAuthenticated()) {
        	//            UsernamePasswordToken
            UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
            // rememberme:       ,authc         
            token.setRememberMe(true);
            try {
            	//          realm        token realm  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException{}    
                currentUser.login(token);
            } 
            //       
            catch (UnknownAccountException uae) {
                log.info("----> There is no user with username of " + token.getPrincipal());
                return; 
            } 
            //       
            catch (IncorrectCredentialsException ice) {
                log.info("----> Password for account " + token.getPrincipal() + " was incorrect!");
                return; 
            } 
            //     
            catch (LockedAccountException lae) {
                log.info("The account for username " + token.getPrincipal() + " is locked.  " +
                        "Please contact your administrator to unlock it.");
            }
            // 
            catch (AuthenticationException ae) {
                //unexpected condition?  error?
            }
        }

        log.info("----> User [" + currentUser.getPrincipal() + "] logged in successfully.");
     
        //    schwartz   
        if (currentUser.hasRole("schwartz")) {
            log.info("----> May the Schwartz be with you!");
        } else {
            log.info("----> Hello, mere mortal.");
            return; 
        }

       
        //   lightsaber:weild   (           )
        if (currentUser.isPermitted("lightsaber:weild")) {
            log.info("----> You may use a lightsaber ring.  Use it wisely.");
        } else {
            log.info("Sorry, lightsaber rings are for schwartz masters only.");
        }

       
        //
        if (currentUser.isPermitted("user:delete:zhangsan")) {
            log.info("----> You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.  " +
                    "Here are the keys - have fun!");
        } else {
            log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
        }

      
        //  
        System.out.println("---->" + currentUser.isAuthenticated());
        currentUser.logout();
        System.out.println("---->" + currentUser.isAuthenticated());
        System.exit(0);
    }
}

좋은 웹페이지 즐겨찾기