A segurança está em toda parte. Aproveitei o feriado para ler os documentos de Shiro e documentar a integração da bota da primavera de Shiro para controlar os direitos de acesso com base em funções no banco de dados
Introdução
O Apache Shiro é uma estrutura de segurança de código aberto poderoso, flexível. Ele lida com autenticação, autorização, gerenciamento de sessões corporativas e criptografia de maneira limpa.
A figura acima mostra a arquitetura básica de Shiro
Autenticação
Às vezes chamado de "login" para provar que o usuário é o próprio usuário
Autorização
O processo de controle de acesso, isto é, determinar "quem" acessa "o que"
Gerenciamento de sessão
Gerenciar sessões específicas do usuário. Em Shiro, você pode descobrir que todas as informações da sessão do usuário serão controladas pelo Shiro.
Criptografia (criptografia)
Algoritmos de criptografia sobre fontes de dados, garantindo a facilidade de uso
Começar
ambiente
Botagem da mola 1.5.9 MySQL 5.7 Maven 3.5.2 Dados da mola JPA LOMOBOK
Adicione dependências
Somente as principais dependências Shiro são dadas aqui
<Depencency> <voundId> org.apache.shiro </frugiD> <ArtifactId> shiro-spring-boot-starter </artifactid> <versão> 1.4.0-rc2 </sipers> </pendencence>
Configuração
Precisamos apenas da tabela de usuários e da tabela de papéis por enquanto. Modificar o arquivo de configuração na inicialização da primavera criará automaticamente uma tabela de banco de dados para nós
Servidor: Porta: 8888Spring: DataSource: Driver-Class-Name: com.mysql.jdbc.driver Nome de usuário: Raiz Senha: ROOT URL: JDBC: MySQL: // LocalHost: 3306/shiro? CaracterenCoding = utf-8 & usessl = falsel-a Generate-DDL: Generate DDL:
entidade
Role.java
@Data @entitypublic class fun {@id @generatedValue ID inteiro privado; private Long UserID; função de sequência privada;}User.java
@Data @entitypublic classe usuário {@id @generatedValue Private Long ID; Nome de usuário privado de string; senha de sequência privada;}Reino
Primeiro, crie a classe Realm, herdem a partir da AutorizingRealm e personalize nossos próprios métodos de autorização e autenticação. A Realm é um componente que pode acessar dados de segurança específicos para o aplicativo, como usuários, funções e permissões.
RealM.Java
public class Realm estende AutorizandoRealm {@AUTOWIRED UserService privado UserService; // Autorize @Override Protected AuthorizationInfo DogetAuthorizationInfo (PrincipalCollection PrincipalCollection) {// Obtenha o nome de usuário de credenciais string userName = (string) SecurityUtils.getSubject (). GetPrincipal (); // Consulta o objeto do usuário com base no nome de usuário usuário do usuário = userService.getUserByUserName (nome de usuário); // consulta as funções de propriedade da lista de usuários <PRESSE> LIST = ROLoleservice.findbyuserId (user.getId ()); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo (); para (função de função: list) {// dê à função do usuário info.addstringpermission (role.getRole ()); } retornar informações; } // Autorize @Override Authenticationinfo DogEtauthenticationInfo (autenticaçãoToken AuthenticationToken) lança autenticaçãoException {// obtém o nome de uso da string de usuário atual nome de usuário = (string) autenticationToken.getPrincipal (); // Encontrando o usuário do usuário do usuário do usuário = UserService.getUserByUserName (nome de usuário); if (userService.getUserByUserName (nome de usuário) == null) {lança nova desconhecidaCountException ("as informações correspondentes do usuário não foram encontradas neste sistema."); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo (user.getUserName (), user.getpassword (), getName ()); retornar informações; }}Classe de configuração Shiro
Shiroconfig.java
@ConfigurationPublic Classe Shiroconfig {@Bean Public ShirofilterFactoryBean ShirofilterFactoryBean (SecurityManager SecurityManager) {ShirofilterFactoryBean ShirofilterFactoryBean = New ShirofilterFactoryBean (); ShirofilterFactoryBean.SetSecurityManager (SecurityManager); Mapa <string, string> filterChainndefinitionMap = new LinkedHashMap <String, String> (); // a seguir está a cadeia de filtro, filtrando em ordem, então/** precisa colocar o último recurso estático // abrir filterChainndefinitionMap.put ("/favicon.ico", "anon"); // web icon filterChainndefinitionMap.put ("/**", "authc"); shirofilterFactoryBean.SetFilterChaindEfinitionMap (FilterChaIndEfinitionMap); Retornar ShirofilterFactoryBean; } @Bean Public DefaultWebSecurityManager SecurityManager () {DefaultWebUsCurityManager DefaultWebSecurityManager = new DefaultWebSecurityManager (MyRealM ()); Retornar DefaultWebSecurityManager; } @Bean public myRealm myRealM () {myRealm myRealm = new MyRealM (); retornar Myrealm; }}Controlador
UserController.java
@ControllerPublic Classe UserController {@AUTOWIRED PRIVADO UserService UserService; @GetMapping ("/") public string index () {return "index"; } @GetMapping ("/login") public String tologin () {return "Login"; } @GetMapping ("/admin") public string admin () {return "admin"; } @PostMapping ("/Login") public String Dologin (String UserName, String senha) {UserNamePasswordToken token = new UsernamePasswordToken (nome de usuário, senha); Assunto = SecurityUtils.getSubject (); tente {sujeito.login (token); } catch (Exceção e) {e.printStackTrace (); } retornar "Redirecionar: admin"; } @GetMapping ("/home") public string home () {sujeito tente {sujeito.checkpermission ("admin"); } Catch (exceção não autorizada de exceção) {System.out.println ("sem permissões suficientes"); } retornar "Home"; } @GetMapping ("/logout") public string logout () {return "index"; }}Serviço
UserService.java
@ServicePublic Class UserService {@AUTOWIRED PRIVADO UserDAO Userdao; Usuário público getUserByUserName (String UserName) {return userdao.findbyusername (nome de usuário); } @ReQuiresRoles ("admin") public void send () {System.out.println ("Agora tenho a função Admin e posso executar esta instrução"); }}Exibir camada
admin.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> </title </title> </head> <body> <forms) name = "Nome de usuário" /> <input type = "senha" name = "senha" /> <input type = "submit" value = "login" /> < /form> < /body> </html>
home.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> </title </title> </head> <body> </body </body </body </bodys = "utf-8"/> </title> </title> </head> <body>
index.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> </title em </a> </body> </html>
login.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> </title </title> </head> <body> <forms) name = "Nome de usuário" /> <input type = "senha" name = "senha" /> <input type = "submit" value = "login" /> < /form> < /body> </html>
Resumir
Este pequeno caso implementa o controle do acesso ao usuário com base nas funções, a mais importante das quais é o domínio, que atua como uma "ponte" ou "conector" entre os dados do Shiro e o aplicativo.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.