Prefácio
Shiro é uma estrutura de permissão. Para uso específico, você pode verificar o site oficial http://shiro.apache.org/. Ele fornece autenticação de permissão muito conveniente e funções de login.
Como estrutura de código aberto, o Springboot deve fornecer funções que se integram ao Shiro!
Shiro já foi usado na autenticação do projeto antes. É usado com mais frequência no MVC da primavera e é configurado com XML. É relativamente simples e maduro usar Shiro para controle de permissão. Além disso, eu sempre coloquei a sessão de Shiro em MongoDB. Isso está mais alinhado com a intenção original do design do MongoDB. Em projetos distribuídos, o MongoDB também é usado como uma camada intermediária, que é usada para resolver facilmente o problema da sincronização da sessão em ambientes distribuídos.
Desde que o Springboot foi lançado, meu projeto pode basicamente usar o Springboot e também é muito conveniente usar o MAVEN para gerenciamento centralizado unificado. Embora o Springboot também forneça um conjunto de segurança de segurança de segurança de permissão, ele não é relativamente muito útil; portanto, ainda é mais conveniente usar Shiro. A integração do Springboot com Shiro é muito mais simples que o Spring MVC, pelo menos sem várias configurações XML, que parecem mais refrescantes, então começaremos a integrar a próxima.
O método é o seguinte:
O primeiro passo deve ser adicionar as dependências Shiro e Mongo no Maven primeiro. A versão Shiro que eu uso é
<Shiro.version> 1.2.3 </shiro.version>
Adicionar dependências:
<Depencency> <GroupID> org.apache.shiro </foupiId> <TROTIFACTID> Shiro-core </sutifactId> <Version> $ {shiro.version} </sipers> </dependency> <pendencency> <voupid> org.apache.shiro </grupidid> <stifactid> shiro-web-we-web.apache.shiro </grupid> <tutifactid> shiro-web-we-web-web.apache.shiro </grupid> <tutifactid> shiro-web-we-web.apache.shiro </grupid> <tutifactid> shiro-web-we-web-web.apache.shiro </grupo. <versão> $ {shiro.version} </versão> </dependency> <pendency> <roupidId> org.apache.shiro </groupiD> <TRARFACTID> shiro-spring </speRifactId> <sipers> $ {shiro.version} </version> </dependence <pendence> <rushId> </artifactId> shiro-spring </artifactId> <versão> $ {shiro.version} </version> </dependency> <pendence> <voundid> org.mongodb </groupid> <sutefactId> mongo-java-driver </stifactid> <upers> 3.0.0 </versão> </versão> </versão> </versão> <PuerpId> org.springframework.data </frupid> <TROTIFACTID> Spring-Data-MongoDB </ArtifactId> <versão> 1.7.0.reLease </sipers> </dependency>Em seguida, configure o MongoDB no Application.xml ou YML
spring.data.mongodb.host = 127.0.0.1spring.data.mongodb.port = 27017spring.data.mongodb.database = shiro_info
Após a conclusão da configuração, começamos a escrever oficialmente o código de autenticação Shiro, primeiro personalizando um reino de autenticação, herdando da AutorizingRealm
classe pública shirodbrealm estende Autorizador de { / *** Operação de informações do usuário* / private SystemuserService SystemuserService; public ShirodBrealM () {} public ShirodBrealm (SystemuserService SystemuserService) {this.systemuserservie = SystemuserService; } / *** Informações de autorização* / @Override Autorização protegidaInfo DogetAuthorizationInfo (Principais diretores de Collection) {SimpleAuthorizationInfo info = (SimpleAuthorizationInfo) shirokit.getshirosessionAttr ("Perms"); if (null! = info &&! collectyutils.isEmpty (info.getRoles ()) &&! collectionutils.isEmpty (info.getStringPermissions ())) {return info; } retornar nulo; } / *** Informações de autenticação* / autenticação protegidaInfo DogEtauthenticationInfo (autenticaçãoToken AuthcToken) lança autenticaçãoException {usernamePasswordToken token = (UserNamePasswordToken) AuthcToken; String userName = token.getUserName (); if (nome de usuário! = null &&! "". Equals (nome de usuário)) {Systemuser key = new Systemuser (); key.setLoginName (token.getUserName ()); key.setPassword (String.valueof (token.getpassword ())); SystemUser User = SystemuserService.Login (Key); if (usuário! = null) {sujeito usertemp = securityUtils.getSubject (); usertemp.getSession (). SetAttribute ("userID", user.getId ()); usertemp.getSession (). SetAttribute ("nome de usuário", user.getUserName ()); Retornar novo SimpleAuthenticationInfo (user.getLoginName (), user.getpassword (), getName ()); }} retornar nulo; }}Armazene a sessão no repositório e implementação do MongoDB:
interface pública shirosessionRepository { / ** * * @param session * / void Savesession (sessão de sessão); ......}MongodbsessionRepository.java
classe pública mongodbsessionRepository implementa ShirosessionRepository {Mongotemplate privado de Mongotemplate; public MongodbsessionRepository () {} public MongodbsessionRepository (Mongotemplate Mongotemplate) {this.Mongotemplate = Mongotemplate; } @Override public void Savesession (sessão de sessão) {if (session == null || session.getId () == null) {return; } SessionBean Bean = new SessionBean (); bean.setKey (getSessionKey (session.getId ())); bean.setValue (Serializeutil.Serialize (sessão)); bean.setPrincipal (nulo); bean.sethost (session.gethost ()); bean.setstarttimestamp (session.getStartTimestamp ()); bean.setLastAccessTime (session.getLastAccessTime ()); bean.setTimeoutTime (getTimeoutTime (session.getStartTimestamp (), session.getTimeout ()); Mongotemplate.insert (Bean); } ......}ShirosessionDao.java
classe pública shirosessionDao estende abstractSessionDao { / *** logger* / private static final logger log = loggerFactory.getLogger (shirosessionDao.class); / *** armazenamento de banco de dados*/ private ShirosessionRepository ShirosessionRepository; / ** * @return */ public ShirosessionRepository getShirosessionRepository () {return ShirosessionRepository; } / ** * * @param shirosessionRepository * / public void setShirosessionRepository (ShirosessionRepository ShirosessionRepository) {this.shirosessionRepository = shirosessionRepository; } @Override public void update (sessão) lança desconhecidaSessionException {getShirosessionRepository (). UpdateSession (sessão); } @Override public void Delete (sessão sessão) {if (session == null) {log.error ("sessão não pode ser nula, excluir falha"); retornar; } ID serializável = session.getId (); if (id! = null) {getShirosessionRepository (). deleteSession (id); }} @Override Public Collection <Session> getActiveSessions () {return getShirosessionRepository (). GetAllSessions (); } @Override Protected Serializable Docreate (sessão de sessão) {serializável sessionID = this.generatesessionId (sessão); this.assignSessionId (Session, SessionId); getShirosessionRepository (). Savesession (sessão); retornar sessionID; } @Override Sessão protegida DoreadSession (sessão serializável) {return getShirosessionRepository (). GetSession (sessionId); }}OK! Todas as classes básicas foram concluídas e, finalmente, escreva uma configuração para inicializar e configurar Shiro
@ConfigurationPublic Classe Shiroconfig {@Resource Mongotemplate privado Mongotemplate; @Resource Private SystemserService SystemuserService; // Este é o serviço usado para determinar o nome do usuário e a senha @Bean Public ShirofilterFactoryBean Shirofilter (DefaultWebSecurityManager SecurityManager) {ShirofilterFactoryBean ShirofilterFactoryBean = New ShiroFilterFactoryBeanBeanBeanBean (); ShirofilterFactoryBean.SetSecurityManager (SecurityManager); ShirofilterFactoryBean.SetLoginurl ("/Login"); ShirofilterFactoryBean.SetSuccessUrl ("/index"); ShirofilterFactoryBean.setunauthorizedurl ("/403"); // interceptador. Mapa <string, string> filterChainndefinitionMap = new LinkedHashMap <String, String> (); filterChainndefinitionMap.put ("/static/**", "anon"); filterChainndefinitionMap.put ("/ajaxlogin", "anon"); filterChainndefinitionMap.put ("/libs/**", "anon"); filterChainndefinitionMap.put ("/imagens/**", "anon"); filterChainndefinitionMap.put ("/logout", "logout"); filterChainndefinitionMap.put ("/**", "authc"); shirofilterFactoryBean.SetFilterChaindEfinitionMap (FilterChaIndEfinitionMap); Retornar ShirofilterFactoryBean; } public AuthorizationAttributesOrCeadVisor AuthorizationAttributesOrCeadVisor (DefaultWebSessionManager SecurityManager) {AuthorizationAttributesourCeadVisor Adv = new AuthorizationAttributesourCeadvisor (); Adv.SetSecurityManager (SecurityManager); retornar adv; } @Bean Public DefaultWebSecurityManager SecurityManager (DefaultWebSessionManager SessionManager, ShirodBrealm MyShirorealm) {DefaultWeburCurityManager SecurityManager = new DefaultWebSecurityManager (); // Defina o reino. SecurityManager.SetRealm (MyShirorealm); SecurityManager.SetSessionManager (SessionManager); Retornar SecurityManager; } /*** Reino de autenticação; (Passe aqui SystemuserService para a inicialização personalizada de ShirodBrealm) * * @return */ @Bean public ShirodBrealm myshirorealm () {shirodbrealm myshirorealM = new ShirodBrealm (SystemuserService); devolver myshirorealm; } @Bean Public DefaultWebSessionManager SessionManager (shirosessionDao shirosessionDao) {DefaultWebSessionManager sessionManager = new DefaultWebSessionManager (); sessionmanager.setglobalsessionTimeout (1800000L); sessionManager.SetDeleteInValidSessions (true); sessionManager.SetSessionValidationschedulereNabled (true); sessionManager.SetSessionDao (ShirosessionDao); sessionManager.SetSessionIDookieEnabled (true); SimpleCookie Cookie = new SimpleCookie (shirohttpsession.default_session_id_name); Cookie.SethttPonly (true); Cookie.setMaxage (1800000); sessionManager.SetSessionIdCookie (Cookie); retorno sessionmanager; } @Bean Public ShirosessionDao ShirosessionDao (MongoDbsessionRepository ShirosessionRepository) {ShirosessionDao Dao = new ShirosessionDao (); Dao.setShirosessionRepository (ShirosessionRepository); retornar Dao; } @Bean MONGODbSessionRepository ShirosessionRepository () {MongoDbsessionRepository resp = novo MongoDbsessionRepository (Mongotemplate); retornar resp; }}A tarefa é realizada. Esta é apenas uma configuração simples. O código foi extraído e modificado do projeto. Quanto a como usá -lo no controlador e como autenticar com diferentes permissões, é suficiente implementá -lo em seu próprio código.
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.