시로는 무엇입니까?
Shiro는 인증 및 액세스 인증을위한 Java 플랫폼의 오픈 소스 권한 프레임 워크입니다. 구체적으로, 다음 요소에 대한 지원이 충족됩니다.
Q : 그룹에 대한 지원?
A : Shiro는 기본적으로 그룹에 대한 설정 권한을 지원하지 않습니다.
Q : 그룹의 역할 할당의 요구를 충족시킬 수 있습니까?
A : 확장 영역은 그룹에 역할 할당을 지원할 수 있으며, 이는 실제로 그룹의 모든 사용자에게 권한을 할당하는 것입니다.
Q : 데이터 권한 지원? 비즈니스 시스템에서 정의 되었습니까?
A : Shiro는 프론트 엔드 제어 요소를 숨기거나 표시하고 리소스 액세스 권한을 확인하는 데 사용되는 작동 권한에 대한 제어만을 구현합니다. 데이터 권한은 특정 비즈니스 요구와 밀접한 관련이 있으며 Shiro 자체는 데이터 권한을 제어 할 수 없습니다.
Q : 동적 권한 할당?
A : 동적 권한 할당을 지원하려면 org.apache.shiro.realm.realm을 확장하십시오.
Q : 스프링과 통합?
A : Spring과의 통합을 지원할 수 있으며 Shiro는 JSP 태그도 지원합니다.
이전 블로그에서 우리는 Shiro의 두 가지 가장 큰 기능, 인증 및 승인에 대해 이야기했습니다. 단일 사인온도 인증의 일부입니다. 기본적으로 Shiro는 CAS와의 통합을 구현했으며 통합 구성을 추가하면 괜찮을 것입니다.
1. Shiro-Cas 패키지를 추가하십시오
<!-Shiro는 CAS 단일 포인트를 통합합니다-> <pectionement> <groupId> org.apache.shiro </groupid> <artifactid> Shiro-Cas </artifactid> <2.4 </version> </dependency>
2. 단일 사인온 구성을 추가하십시오
여기에서 쉬운 참조를 위해 모든 구성을 게시했으며 세부 지침이 구성에 추가되었습니다.
패키지 com.chhliu.springboot.shiro.config; java.util.linkedhashmap import; java.util.map import; javax.servlet.filter import; import org.apache.shiro.cache.ehcache.ehcachemanager; import org.apache.shiro.cas.casfilter; import org.apache.shiro.cas.cassubjectFactory; import org.apache.shiro.spring.lifecyclebeanpostprocessor; import org.apache.shiro.spring.security.interceptor.authorizationattributesourceadvisor; import org.apache.shiro.spring.web.shirofilterfactorybean; import org.apache.shiro.web.mgt.defaultwebsecurityManager; import org.jasig.cas.client.session.singlesignoutfilter; import org.jasig.cas.client.session.singlesignouthttpsessionListener; org.springframework.aop.framework.autoproxy.defaultAdvisorAutoProxycreator; org.springframework.boot.web.servlet.filterregistrationBean; import org.springframework.boot.web.servlet.servletlistenergenerregistrationbean; import org.springframework.context.annotation.bean; org.springframework.context.annotation.configuration; org.springframework.context.annotation.dependson; org.springframework.core.ordered import; org.springframework.core.annotation.order import; org.springframework.web.filter.delegatingfilterproxy; /*** Shiro 구성** Apache Shiro Core는 SpringMVC가 DispachServlet을 사용하여 제어하는 것처럼 필터를 통해 구현됩니다. * 필터를 사용하므로 일반적으로 필터링 및 권한 검증이 URL 규칙을 통해 수행된다고 추측 할 수 있으므로 URL에 대한 일련의 규칙 및 액세스 권한을 정의해야합니다. * * @author chhliu */@configuration public class shiroconfiguration {// cas server 주소 공개 정적 최종 문자열 casserverurlprefix = "http://127.0.0.1"; // CAS 로그인 페이지 주소 공개 정적 최종 문자열 CASLOGINURL = CASSERVERURLPREFIX + "/로그인"; // CAS 로그 아웃 페이지 주소 공개 정적 최종 문자열 caslogouturl = casserverurlprefix + "/logout"; // 프로젝트에서 외부 세계 공개 정적 최종 문자열 shiroserverUrlpRefix = "http://127.1.28:8080"; // casfilter urlpattern public static final String casfilterurlpattern = "/index"; // 로그인 주소 주소 공개 정적 최종 문자열 loginurl = casloginurl + "? service =" + shiroserverurlprefix + casfilterurlpattern; // 로그 아웃 주소 (Casserver는 서비스 점프 함수를 활성화하고 cas.logout.followserviceredirects = webapps/cas/web-inf/cas.properties 파일)를 활성화해야합니다. 공개 정적 최종 문자열 logouturl = caslogouturl+"? service ="+loginurl; // 성공적인 주소 로그인 // 공개 정적 최종 문자열 loginsuccessurl = "/index"; // 허가 인증 실패 점프 주소 공개 정적 최종 문자열 UnauthorizedUrl = "/error/403.html"; / ** *Instantiate SecurityManager,이 클래스는 Shiro의 핵심 클래스입니다 */ @Bean public defaultWebSecurityManager SecurityManager () {defaultWebSecurityManager SecurityManager = 새 DefaultWebSecurityManager (); SecurityManager.setRealm (myshirocasRealm ()); // <!-ehcache cache를 사용하는 사용자 인증/인증 정보 캐시-> securitymanager.setCacheManager (getehcachemanager ()); // subjectFactory를 지정합니다. CAS의 기억 내 함수를 구현하려면 다음 cassubjectFactory를 사용하여 SecurityManager subjectFactory SecurityManager.setSubjectFactory (new cassUbjectFactory ())로 설정해야합니다. 반품 보안 관리자; } / *** 캐시 구성* @return* / @bean public ehcachemanager getehcachemanager () {ehcachemanager em = new ehcacheManager (); Em.setCachemanagerConfigfile ( "classpath : config/ehcache-shiro.xml"); 반환 EM; } /*** 영역을 구성합니다. Casrealm을 사용하고 있기 때문에 단일 사인온 기능이 통합되었습니다 * @param cachemanager * @return */ @bean public myshirorealm myshirocasrealm () {myshirorealm realm = new MyShirorealm (); // CAS 로그인 서버 주소 PREFIX realM.SETCASSERVERURLPREFIX (ShiroConFiguration.CasserVerurlPrefix); // 클라이언트 콜백 주소, 로그인이 성공한 후 점프 주소 (자체 서비스 주소) realM.SetCassErvice (shiroconfiguration.shiroserVerurlpRefix + shiroconfiguration.casfilterurlpattern); // 로그인 후 기본 역할이 성공적이어서 사용자 역할 realM.SetDefaLtroles ( "사용자")의 기본값; 리턴 영역; }/ ** * 등록 단일 사인 아웃 리스너 * @return */ @suppresswarnings ({ "rawtypes", "unchecked"}) @bean @order (ordered.highest_precedence) // 우선 순위는 CAS보다 높습니다. servletlistenergenerregistrationbean (); bean.setListener (New SinglesInsignouthTtPsessionListener ()); bean.setenabled (true); 귀환 콩; } / ** * 싱글 사인아 필터 등록 * @return * / @bean public filterregistrationbean singlesignoutfilter () {FilterRegistrationBean bean = new FilterRegistrationBean (); bean.setName ( "SinglesIgnoutFilter"); bean.setfilter (new singlesignoutfilter ()); bean.addurlpatterns ( "/*"); bean.setenabled (true); 귀환 콩; } / ** * 레지스터 위임 필터 프록시 (Shiro) * / @bean public filterregistrationbean delegatingfilterproxy () {filterregistrationbean filterregistration = new FilterregistrationBean (); FilterRegistration.SetFilter (New DelegatingFilterProxy ( "Shirofilter")); //이 값은 기본적으로 거짓이므로 수명주기가 SpringApplicationContext에 의해 관리됨을 나타냅니다. True로 설정된 ServletContainer는 FilterRegistration.AdDinitParameter ( "TargetFilterLifeCycle", "True")에 의해 관리된다는 것을 의미합니다. FilterRegistration.SetEnabled (true); FilterRegistration.AdDurlPatterns ( "/*"); 반환 필터 등록; } / ***이 클래스는 org.apache.shiro.util.initializable 인터페이스를 구현하는 Shiro 객체의 초기 또는 사악한 메소드가 자동으로 호출되도록 보장 할 수 있습니다.* Init-Method 또는 Odgory-Method 메소드를 수동으로 지정하지 않고* 참고 :이 클래스가 사용되는 경우 초기화 방법을 수동으로 지정할 필요가 없습니다. "LifeCycleBeanPostProcessor") Public LifeCycleBeanPostProcessor getLifeCycleBeanPostProcessor () {return new LifeCycleBeanPostProcessor (); } /*** 다음 두 가지 구성은 주로 Shiro AOP 주석 지원을 가능하게하는 데 사용됩니다. 프록시 방법을 사용하십시오. 따라서 코드 지원을 활성화해야합니다. * @return */ @bean @dependson ( "LifeCycleBeanPostProcessor") public defaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator () {defaultAdvisorAutoProxyCreator DAAP = 새로운 DefaultAdvisorAutoProxyCreator (); DAAP.SETPROXYTARGETCLASS (true); 반환 DAAP; } / ** * @Param SecurityManager * @return * / @Bean Public AuthorizationAttributesOUrceAdvisor getAuthorizationAttRibutesOURCeadvisor (defaultWebSecurityManager SecurityManager) {AuthorizationAttribeSourceAdvisor AuthorizationAttributeSourCeadvisor = new AuthorizationAttribeSourceAdvisor (); AuthorizationAttributesourceadvisor.SetSecurityManager (SecurityManager); Return AuthorizationAttributesourceadvisor; } / *** cas filter* @return* / @bean (name = "casfilter") public casfilter getcasfilter () {casfilter casfilter = new Casfilter (); casfilter.setName ( "casfilter"); casfilter.setenabled (true); // 로그인이 실패한 후 점프하는 URL, 즉 Shiro는 Tiket casfilter.setfailureurl (loginurl)을 확인하기 위해 casrealm의 dogetAuthenticationInfo 메소드를 실행합니다. Casfilter를 반환하십시오. } / ** * 공장 모드를 사용하여 Shirofilter를 만들고 초기화하고 초기화하십시오 * @param securitymanager * @param casfilter * @return * / @bean (public shirofilterfactorybean getshirofilterfactorybean (defaultwebsecmanager securitymanager, casfilter casfilter) vestortory shirofilter arfilterclatory arfilterclatory arfilterforcy shirofilterfactorybean (); // SecurityManager는 ShirOfilterFactoryBean.SetSecurityManager (SecurityManager)를 설정해야합니다. // 기본값을 설정하지 않으면 웹 프로젝트의 루트 디렉토리에서 "/login.jsp"페이지를 자동으로 찾아 ShiroFilterFactoryBean.setLoginUrl (loginurl); / * * 로그인 후 리디렉션 할 연결이 성공적입니다. 설정되지 않은 경우 기본적으로 이전 URL로 이동합니다. 예를 들어, 브라우저에 http : // localhost : 8080/userlist를 처음 입력했지만 이제 사용자가 로그인되지 않았으므로 로그인 페이지로 이동합니다. 로그인 인증이 통과되면 * 페이지는 로그인이 성공한 후 인덱스 페이지 대신 http : // localhost : 8080/userList 페이지로 자동 이동합니다. 이 필드는 *// shirofilterfactorybean.setsuccessurl (loginsuccessurl)을 설정하는 것이 좋습니다. // 페이지에 대한 무단 액세스 설정 ShiroFilterFactoryBean.setUnauthorizedUrl (UnauthorizedUrl); / * * shirofilter에 Casfilter를 추가하십시오. Casfilter는 Shirofilter 앞에 배치해야합니다. * Shiro 로그인을 입력하기 전에 프로그램이 단일 지점 인증을 입력 할 수 있도록 */ map <String, 필터> 필터 = New LinkedHashMap <> (); filters.put ( "Casfilter", Casfilter); // 로그 아웃은 단일 포인트 로그 아웃 // 필터로 대체되었습니다. shirofilterfactorybean.setfilters (필터); loadshirofilterchain (shirofilterfactorybean); 반환 shirofilterfactorybean; } /*** ShirOfilter 권한 제어 규칙을로드 한 다음 데이터베이스에서 읽은 다음 구성) 역할 /권한 정보는 MyShirocasRealm 객체에서 제공합니다. DogetAuthorizationInfo 구현. * 규칙 의이 부분은 제작 중에 데이터베이스에 배치됩니다 * @param shirofilterfactorybean */private void rodshirofilterchain (shirofilterfactorybean shirofilterfactorybean) {//////////////////////////////////////////////////////////////////////////4). 파일. 여기에 추가 된 필터는 순서대로해야하므로 linkedhashmap ////////////////////////////////////////////////map <문자열, String> FilterchainDefinitionMap = New LinkedHashmap <문자열> (); FilterChainDefinitionMap.put (casfilterurlpattern, "casfilter"); // 2. FilterChainDefinitionMap.put ( "/css/**", "anon"); FilterChainDefinitionMap.put ( "/js/**", "anon"); FilterChainDefinitionMap.put ( "/login", "anon"); // 로그 아웃이 단일 지점으로 처리되므로 로그 아웃 페이지를 ANON으로 설정하고 Shiro의 logoutFilter FilterChainDefinitionMap.put ( "/logout", "anon")에 의해 인터셉트 할 필요가 없습니다. FilterChainDefinitionMap.put ( "/error", "anon"); // 3. 인터셉트 된 요청 (로컬 데이터베이스 또는 Casserver (WebService, HTTP 등)에서 얻은 경우 역할 권한이 구성된 위치를 참조) FilterChainDefinitionMap.put ( "/User", "AuthC"); // 로그인 필수 // 4. 로그인은 FilterChainDefinitionMap.put ( "/**", "authc")을 차단하지 않습니다. shirofilterFactoryBean.SetFilterChainDefinitionMap (FilterChainDefinitionMap); }}일부 구성 참조 : http://shiro.apache.org/spring.html
3. 영역을 쓰십시오
단일 사인온의 기능을 통합해야하므로 Casrealm 클래스를 통합해야합니다. 이 클래스는 우리를위한 단일 포인트 인증의 기능을 구현했습니다. 우리가해야 할 일은 권한 부품의 기능을 구현하는 것입니다. 예제 코드는 다음과 같습니다.
패키지 com.chhliu.springboot.shiro.config; import javax.annotation.resource; import org.apache.shiro.securityutils; import org.apache.shiro.authc.authenticationinfo; import org.apache.shiro.authc.authenticationToken; import org.apache.shiro.authz.authenticationInfo; import org.apache.shiro.authz.simpleauthorizationinfo; import org.apache.shiro.cas.casrealm; import org.apache.shiro.subject.principalcollection; com.chhliu.springboot.shiro.mode.syspermission import; com.chhliu.springboot.shiro.mode.syspermission import; import com.chhliu.springboot.shiro.mode.userinfo; com.chhliu.springboot.shiro.service.userinfoservice import; /*** 권한 검증 핵심 클래스; 단일 사인온이 사용되므로 인증 할 필요가 없으며 승인 만 필요합니다 * @author chhliu */ public class myshirorealm은 casrealm {@Resource private userInfoservice userInfoservice; / *** 1. CAS 인증, 사용자 신원 확인* 2. 쉽게 액세스 할 수 있도록 사용자 기본 정보를 세션에 설정하십시오* 3.이 방법은 Casrealm의 인증 메소드를 직접 사용할 수 있으며, 이는 테스트*/ @override authenticationInfo로만 사용됩니다. Casrealm은 우리를 위해 단일 인증 지점을 구현했습니다. AuthenticationInfo authc = super.dogetauthenticationInfo (토큰); // 로그인 계정을 가져옵니다. CAS 인증이 성공하면 계정이 저장됩니다. 문자열 ac // 쉽게 프로그램 수집을 위해 사용자 정보를 세션에 저장합니다. 여기서 로그인 계정을 기반으로 사용자 정보를 쿼리 할 수 있습니다. SecurityUtils.getSubject (). getSession (). setattribute ( "no", account); 반환 인증; } /*** 콜백은이 메소드가 Hasrole 및 Haspermission을 호출 할 때만 수행됩니다. * * 권한 정보. (권한 부여) : 1. 사용자가 정상적으로 종료하면 캐시가 자동으로 지워집니다. 2. 사용자가 비정상적으로 종료하면 캐시가 자동으로 지워집니다. * 3. 사용자의 권한을 수정하지만 사용자가 시스템에서 로그 아웃하지 않으면 수정 된 권한은 즉시 발효 될 수 없습니다. (수동으로 구현해야합니다. 통화를 위해 서비스를 제공) * 권한이 수정 된 후 영역의 방법이 호출됩니다. 영역은 Spring에 의해 관리되었으므로 영역 인스턴스는 스프링에서 얻어지고 Clear Cached 메소드가 호출됩니다. * : 승인은 승인 된 액세스 제어이며, 사용자가 수행 한 작업을 승인하는 데 사용되는 승인 된 액세스 제어이며, 사용자가 특정 링크, 특정 리소스 파일 등에 액세스하는 등 현재 작업을 허용하는지 여부를 증명합니다. 구성-> myshirorealm.dogetauthorizationInfo () "); SimpleAuthorizationInfo AuthorizationInfo = New SimpleAuthorizationInfo (); // 단일 로그인 후 사용자 이름을 가져 오면 세션에서 사용자 이름이 성공한 후에 사용자 이름이 세션 문자열 username = (string) super.getAvailablePrincipal (Principals)에 넣었 기 때문에 세션에서 얻을 수도 있습니다. // principals.getPrimaryPrincipal (); 이 메소드는 사용자 이름을 얻을 수 있습니다. // 사용자 이름 userInfo userInfo = userInfoservice.findByUserName (username)에 따라 사용자 이름 및 권한 정보를 얻습니다. // 사용자의 해당 역할 및 권한 정보를 (sysRole 역할 : userInfo.getRolelist ()) {erustrizationInfo.addrole (role.getRole ()); for (syspermission p : roble.getPermissions ()) {userizationInfo.AddStringPermission (p.getPermission ()); }} return osportizationInfo; }} 다음으로 검증 테스트를 수행 할 수 있습니다!
브라우저에 HTTP : 127.0.1.28 : 8080/UserInfo/UserList를 입력하면 단일 포인트 로그인 페이지로 자동 이동하는 것을 발견합니다.
그런 다음 사용자 이름과 비밀번호를 입력하면 자동으로 HTTP : 127.0.1.28 : 8080/userInfo/userList 페이지로 이동합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.