머리말
Shiro는 권한 프레임 워크입니다. 특정 용도로 공식 웹 사이트 http://shiro.apache.org/를 확인할 수 있습니다. 매우 편리한 권한 인증 및 로그인 기능을 제공합니다.
오픈 소스 프레임 워크로서 SpringBoot는 Shiro와 통합되는 기능을 제공해야합니다!
Shiro는 이전에 프로젝트 인증에 사용되었습니다. 스프링 MVC에서 더 자주 사용되며 XML로 구성됩니다. 권한 제어를 위해 Shiro를 사용하는 것은 비교적 간단하고 성숙합니다. 또한, 나는 항상 Shiro의 세션을 Mongodb에 넣었습니다. 이것은 MongoDB의 원래 디자인 의도와 더 일치합니다. 분산 프로젝트에서 MongoDB는 또한 중간 계층으로 사용되며, 분산 환경에서 세션 동기화 문제를 쉽게 해결하는 데 사용됩니다.
SpringBoot가 출시 된 이후, 내 프로젝트는 기본적으로 SpringBoot를 사용할 수 있으며 Unified Centralized Management에 Maven을 사용하는 것이 매우 편리합니다. SpringBoot는 또한 허가 보안 프레임 워크 Spring Security 세트를 제공하지만 상대적으로 유용하지 않으므로 Shiro를 사용하는 것이 더 편리합니다. Shiro와의 Springboot 통합은 최소한 XML 구성이 많지 않아 Spring MVC보다 훨씬 간단합니다.
이 방법은 다음과 같습니다.
첫 번째 단계는 먼저 Maven에 Shiro 및 Mongo 의존성을 추가하는 것입니다. 내가 사용하는 Shiro 버전은입니다
<Shiro.version> 1.2.3 </shiro.version>
종속성 추가 :
<pectionency> <groupid> org.apache.shiro </groupid> <artifactid> shiro-core </artifactid> <버전> $ {shiro.version} </version} </version} </version> <pectionency> <groupid> org.apache.shiro </groupid> shiro-web </artifactid> <버전> $ {shiro.version} </version> </dependency> <pectionency> <groupid> org.apache.shiro </groupid> <artifactid> shiro-spring </artifactid> <버전> $ {shiro.version} </version> </fectionency> <groupid> org.apache.apache.apache.apache <Artifactid> Shiro-Spring </artifactid> <버전> $ {shiro.version} </version} </version> </dependency> <groupId> org.mongodb </groupID> <artifactID> Mongo-Java-driver </artifactid> <3.0.0 </dependency> </delation> <groupid> org.springframework.data </groupid> <artifactid> Spring-Data-Mongodb </artifactid> <bersion> 1.7.0. Release </version> </fectionency>그런 다음 application.xml 또는 yml에서 mongodb를 구성하십시오
spring.data.mongodb.host = 127.0.0.1spring.data.mongodb.port = 27017spring.data.mongodb.database = shiro_info
구성이 완료되면 공식적으로 Shiro 인증 코드를 작성하고 먼저 인증 영역을 사용자 정의하고 REARIGING REALM을 상속 받기 시작합니다.
공개 클래스 Shirodbrealm은 REALM을 승인합니다 { / *** 사용자 정보 운영* / private SystemUsersErvice SystemUserService; public shirodbrealm () {} public shirodbrealm (SystemUserService SystemUserservice) {this.systemuserService = SystemUserService; } / *** 승인 정보* / @override Protected AuthorizationInfo DogetAuthorizationInfo (PrincipalCollection Principals) {simpleAuthorizationInfo info = (SimpleAuthorizationInfo) shirokit.getShirosessionattr ( "Perms"); if (null! = info &&! collectionUtils.isempty (info.getRoles ()) &&! collectionUtils.isempty (info.getStringPermissions ())) {return info; } return null; } / *** 인증 정보* / 보호 된 AuthenticationInfo dogetAuthenticationInfo (AuthenticaticToken AuthCtoken) authenticationException {usernamepasswordtoken token = (usernamepasswordToken) authctoken; 문자열 username = token.getusername (); if (username! = null &&! "". key.setLoginName (token.getusername ()); key.setpassword (String.valueof (token.getPassword ()); SystemUser user = SystemUserservice.login (키); if (user! = null) {giversity usertemp = securityUtils.getSubject (); usertemp.getSession (). setAttribute ( "userId", user.getId ()); usertemp.getSession (). setAttribute ( "username", user.getusername ()); new simpleAuthenticationInfo (user.getLoginName (), user.getPassword (), getName ()); }} return null; }}MongoDB의 저장소 및 구현으로 세션을 저장 :
공개 인터페이스 shirossessionrepository { / ** * * @param 세션 * / void savesession (세션 세션); ......}mongodbsessionrepository.java
공개 클래스 mongodbsessionrepository는 shirosessionrepository {private mongotemplate mongotemplate; public mongodbsessionrepository () {} public mongodbsessionrepository (mongotemplate mongotemplate) {this.mongotemplate = mongotemplate; } @override public void savesession (세션 세션) {if (session == null || session.getId () == null) {return; } SessionBean Bean = New SessionBean (); bean.setkey (getsessionkey (session.getId ()); bean.setValue (serializeutil.serialize (session)); bean.setprincipal (null); bean.sethost (session.gethost ()); bean.setStartTimestamp (session.getStartTimestamp ()); bean.setLastAccessTime (session.getLastAccessTime ()); bean.settimeouttime (gettimeouttime (session.getStartTimestamp (), session.getTimeout ())); mongotemplate.insert (bean); } ......}Shirossessiondao.java
공개 클래스 ShirossessionDao는 AbstractSessionDao { / *** Logger* / private static final logger log = loggerfactory.getLogger (shirossessionDao.class); / *** 데이터베이스 스토리지*/ 개인 shirosessionrepository shirosessionrepository; / ** * @return */ public shirosessionrepository getShirosessionRepository () {return shirosessionRepository; } / ** * * @param shirosessionrepository * / public void setshirosessionrepository (shirosessionrepository shirosessionrepository) {this.shirosessionrepository = shirosessionrepository; } @override public void update (세션 세션) unknownsessionException {getShirosessionRepository (). 업데이트 (세션); } @override public void delete (세션 세션) {if (session == null) {log.error ( "세션은 null, 삭제 실패"); 반품; } serializable id = session.getId (); if (id! = null) {getShirosessionRepository (). deletesession (id); }} @override public Collection <SelesseTIVESSESSIONS () {return getShirossessionRepository (). getAllSessions (); } @override 보호 직렬화 가능한 docreate (세션 세션) {Serializable sessionId = this.generatesSessionID (세션); this.assignsessionId (세션, 세션); getShirosessionRepository (). 저장 (세션); Return SessionId; } @override Protected Session Doreadsession (Serializable SessionId) {return getShirosessionrepository (). getsession (sessionId); }}좋아요! 모든 기본 클래스가 완료되었으며 최종적으로 Shiro를 초기화하고 구성하기위한 구성을 작성합니다.
@ConfigurationPublic Class ShiroConfig {@Resource 개인 Mongotemplate Mongotemplate; @Resource Private SystemUserService SystemUserService; // 이것은 사용자 이름과 암호를 결정하는 데 사용되는 서비스입니다. @Bean Public ShirofilterFactoryBean Shirofilter (DefaultWebsecurityManager SecurityManager) {shirofilterfactorybean shirofilteractorybean = New ShirofilterfactoryBean (); shirofilterFactoryBean.SetSecurityManager (SecurityManager); shirofilterfactorybean.setLoginUrl ( "/login"); shirofilterfactorybean.setsuccessurl ( "/index"); shirofilterfactorybean.setunauthorizedUrl ( "/403"); // 인터셉터. Map <String, String> FilterChainDefinitionMap = New LinkedHashMap <String, String> (); FilterChainDefinitionMap.put ( "/static/**", "anon"); FilterChainDefinitionMap.put ( "/ajaxlogin", "anon"); FilterChainDefinitionMap.put ( "/libs/**", "anon"); FilterChainDefinitionMap.put ( "/images/**", "anon"); FilterChainDefinitionMap.put ( "/logout", "logout"); FilterChainDefinitionMap.put ( "/**", "authc"); shirofilterFactoryBean.SetFilterChainDefinitionMap (FilterChainDefinitionMap); 반환 shirofilterfactorybean; } public AuthorizationAttributesOURCEADvisor AuthorizationAttRibutesOURCEADvisor (DefaultWebsessionManager SecurityManager) {intherizationAttributesOURCEADvisor Adv = 새로운 인증 ATTRIBUTESOURCEADVISOR (); Adv.SetSecurityManager (SecurityManager); 리턴 adv; } @Bean public defaultwebsecurityManager SecurityManager (defaultWebSessionManager SessionManager, ShirodBrealm MyShirorEalm) {defaultWebSecurityManager SecurityManager = 새로운 DefaultWebSecurityManager (); // 영역을 설정합니다. SecurityManager.setRealm (Myshirorealm); SecurityManager.SetSessionManager (SessionManager); 반품 보안 관리자; } /*** 인증 영역; (여기서 SystemUserservice를 맞춤형 Shirodbrealm 초기화로 전달) * * @return */ @bean public shirodbrealm myshirorealm () {shirodbrealm myshirorealm = new shirodbrealm (SystemUserservice); Myshirorealm을 반환합니다. } @Bean public defaultwebsessionManager SessionManager (shirosessionDao shirossessionDao) {defaultWebsessionManager SessionManager = new DefaultWebsessionManager (); SessionManager.setGlobalSessionTimeout (1800000L); SessionManager.SetDeleteInValidSessions (true); SessionManager.SetSessionValidationSchedulerEnabled (true); SessionManager.setSessionDao (ShirossessionDao); SessionManager.SetSessionIdCookieEnabled (true); simplecookie 쿠키 = 새로운 simplecookie (shirohttpsession.default_session_id_name); 쿠키 .sethttponly (true); Cookie.SetMaxage (1800000); SessionManager.SetSessionIdCookie (쿠키); 반품 세션 관리자; . dao.setshirosessionrepository (shirosessionrepository); 반환 다오; } @bean mongodbsessionrepository shirosessionrepository () {mongodbsessionrepository resp = new mongodbsessionrepository (mongotemplate); resp resp; }}작업이 완료되었습니다. 이것은 단순한 구성 일뿐입니다. 코드는 프로젝트에서 발췌 및 수정되었습니다. 컨트롤러에서 사용하는 방법과 다른 권한으로 인증하는 방법에 대해서는 자체 코드로 구현하기에 충분합니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.