Apache Shiro 사용자 매뉴얼 (2) Shiro 인증
인증은 사용자 본인임을 확인하는 과정입니다. 인증 과정에서 사용자는 자신이 합법적인지 확인하기 위해 엔터티 정보(Principal)와 자격 증명 정보(Credentials)를 제출해야 합니다. 가장 일반적인 "엔티티/자격 증명" 조합은 "사용자 이름/비밀번호" 조합입니다.
1. Shiro 인증 프로세스
1. 엔터티/자격 정보 수집
//Example using most common scenario of username/password pair: UsernamePasswordToken token = new UsernamePasswordToken(username, password); //”Remember Me” built-in: token.setRememberMe(true);
UsernamePasswordToken은 가장 일반적인 사용자 이름/비밀번호 인증 메커니즘을 지원합니다. 동시에 RememberMeAuthenticationToken 인터페이스를 구현하므로 토큰을 통해 "remember me" 기능을 설정할 수 있습니다.
단, "기억된"과 "인증된"에는 차이가 있습니다.
기억된 사용자는 익명이 아닌 사용자일 뿐이며, subject.getPrincipals()를 통해 사용자 정보를 얻을 수 있습니다. 하지만 완전히 인증된 사용자는 아닙니다. 인증된 사용자가 필요한 기능에 액세스하는 경우에도 인증 정보를 다시 제출해야 합니다.
이 차이점은 Amazon 웹사이트를 참조하세요. 웹사이트는 기본적으로 로그인한 사용자를 기억합니다. 웹사이트를 다시 방문하면 민감하지 않은 페이지 기능의 경우 기억된 사용자 정보가 페이지에 표시됩니다. 그런데 홈페이지 계정정보에 접속하면 다시 로그인을 해야 합니다.
2. 엔터티/자격증명 정보 제출
Subject currentUser = SecurityUtils.getSubject(); currentUser.login(token);
엔티티/자격증명 정보 수집 후 SecurityUtils 도구 클래스를 통해 현재 사용자를 얻은 후 로그인 메소드를 호출하여 인증을 제출할 수 있습니다. .
3. 인증 처리
try { currentUser.login(token); } catch ( UnknownAccountException uae ) { ... } catch ( IncorrectCredentialsException ice ) { ... } catch ( LockedAccountException lae ) { ... } catch ( ExcessiveAttemptsException eae ) { ... } ... catch your own ... } catch ( AuthenticationException ae ) { //unexpected error? }
예외 정보가 발생하지 않고 로그인 방법이 완료되면 사용자 인증이 성공한 것으로 간주됩니다. 이후 애플리케이션 어디에서나 SecurityUtils.getSubject()를 호출하면 현재 인증된 사용자 인스턴스를 얻을 수 있습니다. subject.isAuthenticated()를 사용하여 사용자가 인증되었는지 확인하면
반대로 로그인 방법이 다음과 같은 경우입니다. 실행 후 예외가 발생하면 인증이 실패한 것으로 간주됩니다. Shiro에는 코드 예제와 같이 인증 실패 이유를 설명하는 풍부한 고유 예외 클래스 세트가 있습니다.
2. 로그아웃 작업
로그아웃 작업은 subject.logout()을 호출하여 로그인 정보를 삭제할 수 있습니다. 예:
currentUser.logout(); //removes all identifying information and invalidates their session too.
로그아웃 작업이 완료된 후 세션 정보는 삭제되고 해당 주제는 익명 사용자로 처리됩니다.
3. 인증 내부 처리 메커니즘
위는 애플리케이션에서 Shiro 인증을 처리하는 과정입니다. 아래에서는 Shiro 인증의 내부 처리 메커니즘을 자세히 설명합니다.
위와 같이 Shiro 아키텍처 다이어그램의 인증 부분을 사용하여 Shiro 인증의 내부 처리 순서를 설명합니다.
1. 사용자 인증 정보 AuthenticationToken 인스턴스 다음에 Subject.login 메소드를 호출하십시오.
2. Sbuject의 인스턴스는 일반적으로 DelegatingSubject 클래스(또는 하위 클래스)의 인스턴스 객체입니다. 인증이 시작되면 애플리케이션에서 설정한 securityManager 인스턴스가 securityManager.login(token) 메서드를 호출하도록 위임됩니다.
3. 토큰(토큰) 정보를 받은 후 SecurityManager는 내장된 Authenticator의 인스턴스(일반적으로 ModularRealmAuthenticator 클래스의 인스턴스)에 인증자.authenticate(token)을 호출하도록 위임합니다. 인스턴스가 조정되어 실제로 Shiro에 대한 플러그형 인증 메커니즘을 제공합니다.
4. 애플리케이션에 여러 Realm이 구성된 경우 ModularRealmAuthenticator는 구성된 AuthenticationStrategy(인증 전략)에 따라 다중 Realm 인증 프로세스를 수행합니다. Realm이 호출된 후 AuthenticationStrategy는 각 Realm 결과에 응답합니다.
참고: 애플리케이션에 Realm이 하나만 구성된 경우 인증 정책을 구성하지 않고 Realm이 직접 호출됩니다.
5. 각 Realm이 제출된 토큰을 지원하는지 확인합니다. 그렇다면 Realm은 getAuthenticationInfo 메소드를 호출하여 Realm의 doGetAuthenticationInfo 메소드를 재정의하여 사용자 정의 인증 처리를 작성합니다.
4. 다중 Realm을 사용한 처리 메커니즘:
1. 인증자
기본 구현은 단일 Realm과 다중 Realm을 모두 지원하는 ModularRealmAuthenticator입니다. Realm이 하나만 구성된 경우 ModularRealmAuthenticator는 Realm을 직접 호출하여 인증 정보를 처리합니다. Realm이 여러 개 구성된 경우 인증 정책에 따라 Realm을 조정하고 인증 정보를 실행하기 위해 적절한 Realm을 찾습니다.
인증기 구성 사용자 정의:
[main] ... authenticator = com.foo.bar.CustomAuthenticator securityManager.authenticator = $authenticator
2、AuthenticationStrategy(认证策略)
当应用程序配置了多个Realm时,ModularRealmAuthenticator将根据认证策略来判断认证成功或是失败。
例如,如果只有一个Realm验证成功,而其他Realm验证失败,那么这次认证是否成功呢?如果大多数的Realm验证成功了,认证是否就认为成功呢?或者,一个Realm验证成功后,是否还需要判断其他Realm的结果?认证策略就是根据应用程序的需要对这些问题作出决断。
认证策略是一个无状态的组件,在认证过程中会经过4次的调用:
在所有Realm被调用之前
在调用Realm的getAuthenticationInfo 方法之前
在调用Realm的getAuthenticationInfo 方法之后
在所有Realm被调用之后
认证策略的另外一项工作就是聚合所有Realm的结果信息封装至一个AuthenticationInfo实例中,并将此信息返回,以此作为Subject的身份信息。
Shiro有3中认证策略的具体实现:
AtLeastOneSuccessfulStrategy 只要有一个(或更多)的Realm验证成功,那么认证将被视为成功
FirstSuccessfulStrategy 第一个Realm验证成功,整体认证将被视为成功,且后续Realm将被忽略
AllSuccessfulStrategy 所有Realm成功,认证才视为成功
ModularRealmAuthenticator 内置的认证策略默认实现是AtLeastOneSuccessfulStrategy 方式,因为这种方式也是被广泛使用的一种认证策略。当然,你也可以通过配置文件定义你需要的策略,如:
[main] ... authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy securityManager.authenticator.authenticationStrategy = $authcStrategy ...
3、Realm的顺序
由刚才提到的认证策略,可以看到Realm在ModularRealmAuthenticator 里面的顺序对认证是有影响的。
ModularRealmAuthenticator 会读取配置在SecurityManager里的Realm。当执行认证是,它会遍历Realm集合,对所有支持提交的token的Realm调用getAuthenticationInfo 。
因此,如果Realm的顺序对你使用的认证策略结果有影响,那么你应该在配置文件中明确定义Realm的顺序,如:
blahRealm = com.company.blah.Realm ... fooRealm = com.company.foo.Realm ... barRealm = com.company.another.Realm securityManager.realms = $fooRealm, $barRealm, $blahRealm
以上就是Apache Shiro 使用手册(二)Shiro 认证的内容,更多相关内容请关注PHP中文网(www.php.cn)!