Este artigo conta a história do Spring Boot Integrando a segurança da primavera para implementar o controle de permissão usando anotações nos métodos e usando um serviço de userDetail personalizado para carregar as informações do usuário do MySQL. Use a criptografia MD5 que vem com segurança para criptografar a senha do usuário. O modelo de página usa o mecanismo Thymeleaf.
Endereço do código-fonte: https://github.com/li5454yong/springboot-security.git
1. Introduzir dependências de POM
<Parent> <puperiD> org.springframework.boot </frupiid> <TRATIFACTID> Spring-boot-starter-parent </ArtifactId> <Versão> 1.4.4.Release </sipers> </parent> </dependências> <pendency> <purgid> org.springFramework.Boot </Grupoid> Artift> </dependency> <pendency> <puperid> org.springframework.boot </frugiD> <stifactId> Spring-boot-Starter-Security </ArtifactId> </ipendency> </dependency> <purfactiD> org.springfamework.security.oauth </GroupId> <stiftid> Spring-spring-spring-spring-springwork.oauth </Groupid> <stiftiD> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <dependency> <PuerpId> com.alibaba </frugiD> <ArtifactId> druid </artifactId> <versão> 1.0.15 </versão> </dependency> </dependências>
Aqui, use o pool de conexão Druid e o Spring Data JPA implementa o acesso ao banco de dados.
2. Configure a segurança da primavera
@Configuration @enablewebmvcSecurity @EnableGlobalMethodSecurity (PrePostEnabled = true) // Ativar anotação de segurança classe pública classe webcurityConfig estende WebSecurityConfigureRAdApter {@Bean @Override AuthenticationManager AuthenticationManager) } @Override Protected void Configure (httpsecurity http) lança a exceção {// permite que todos os usuários acessem "/" e "/home" http.authorizerequests () .antmatchers ("/", "/home"). Permitall () // Acesso a outros endereços requentralizadores. .FormLogin () // Especifique a página de login para ser "/login" .LoginPage ("/login") .DefaultSuccessurl ("/hello") // Após o login bem -sucedido, salte para "/hello" por padrão. .PerMitall () .And () .Logout () .LogoutSuccessUrl ("/home") // O URL padrão após o registro é "/home" .permitall (); } @AUTOWIRED Public void Configurglobal (autenticationManagerBuilder Auth) lança Exceção {Auth .UserDetailSService (CUNDARUSERDETAILSSERVICE () .PasswordEncoder (PasswordEncoder ()); } / *** Defina o método de criptografia da senha do usuário como MD5 CRIPTION* @RETURN* / @Bean public md5passwordEncoder PasswordEncoder () {return md5passwordEncoder (); } / *** UserDetailService personalizado para ler as informações do usuário do banco de dados* @return* / @Bean public CUNDIDUSERDETAILSSERVICE CUSTERUSERDETAILSSERVICE () {Return New CustomUserDetailSService (); }} Somente as configurações básicas são feitas aqui, configurando URL de login, URL que salta após o bem -sucedido o login e o URL que salta após o logout. O uso da anotação @enableGlobalMethodSecurity (pré -tenabled = true) pode permitir a anotação da segurança. Podemos usar @preauthorize e @prefilter em métodos que requerem permissões de controle.
3. UserDetailservice personalizado
classe pública CustomUserDetailSService implementa UserDetailSService {@Autowired // Domain Service Class Private SusserService WaitService; @Override Public userDetails loadUserByUserName (String UserName) lança UserNameNotFoundException {// Suser corresponde à tabela de usuários no banco de dados, que é a tabela que finalmente armazena o usuário e a senha, que pode ser personalizada // este exemplo usa o email como o nome do usuário: SuserSears; if (user == null) {lança new UserNameNotFoundException ("nome de usuário" + nome de usuário + "não encontrado"); } // O SecurityUser implementa o UserDetails e mapeia o email de Suser para o nome de usuário SecurityUser SecurityUser = new SecurityUser (usuário); Coleção <PlemleGrantEDauthority> Autoridades = novo ArrayList <PlemaxGrantEDauthority> (); autoridades.add (New SimpleGrantEDAuthority ("Role_admin")); Retornar SecurityUser; }}Aqui você só precisa implementar a interface UserDetailSService, reescrever o método loadUserByUserName e recuperar as informações do usuário do banco de dados. Finalmente, uma classe de implementação do userDetails é retornada.
4. Defina a configuração de manuseio de erros
@ConfigurationPublic Classe errorPageconfig {@Bean public incorporadoServletContaiCustomizer incorporado } classe estática privada mycustomizer implementa incorporadoservletLearContAineRerCustomizer {@Override public void Personalize (CONTINER DE CONFIGURAÇÃO EMBEDEDDEDSERVLEVERCONTER) {container.adderRorpages (New Errorpage (httpstatus. profidden,/403 "); }}}Quando ocorrer um erro de acesso, pule para "/403".
5. Interface do controlador
@ControllerPublic Classe IndexController {@Resource Private Suserservie SuserserService; @RequestMapping ("/home") public string home () {return "home"; } @Preathorize ("hasRole ('user')") @RequestMapping (value = "/admin", métod = requestMethod.get) public string toadmin () {return "helloAdmin"; } @ReQuestMapping ("/hello") public string hello () {return "hello"; } @RequestMapping ("/login") public String Login () {return "Login"; } @RequestMapping ("/") public String root () {return "Index"; } @RequestMapping ("/403") public string error () {return "403"; }}@Preathorize ("hasRole ('user')") é usado no método toadmin (), indicando que você precisa ter a função do usuário para acessar esse método. Se você deseja controlar o nível de permissões, pode usar @preauthorize ("haspermission ()"). Este é apenas um dos usos. Para mais métodos de uso, você pode ler a documentação oficial. Deve -se notar que o prefixo padrão do Spring Security é "Role_", que foi adicionado por padrão ao usar o método HasRole. Portanto, nossa função de usuário no banco de dados deve ser "role_user", e o prefixo do usuário "role_" é adicionado perante o usuário.
6. Teste
Inicie o projeto e visite http: // localhost: 1130/login
Clique para fazer login e inserir "/hello"
Clique para pular para a página do administrador
Em segundo plano, URL "/admin" correspondente ao método "Usuário", os usuários devem ter a função "Usuário". O usuário que efetuou login também está definido no banco de dados para ter essa função.
Agora, modificamos a função do usuário no banco de dados e alteramos para "role_admin". Depois de fazer login, faça o login novamente, clique no botão "Vá para a página do administrador" novamente e ele saltará para a página a seguir.
Como agora não há permissão de "usuário", uma exceção foi lançada durante o acesso e foi interceptada e redirecionada para "/403".
7. Pós -acesso, código de erro 403
Primeiro, altere "/admin" para postar solicitação
@Preauthorize ("hasRole ('user')") @RequestMapping (value = "/admin", método = requestmethod.post) public string toadmin () {return "helloadmin"; }Altere o método de solicitação do botão "Vá para a página do administrador" da expressão do formulário original, faça o envio do Ajax Post. Quanto ao motivo pelo qual não somos enviados usando o formulário Post, falaremos sobre isso mais tarde. Modifique o código primeiro
<body> <h1 th: inline = "text"> hello [[$ {#httpServletRequest.RemoteUser}]]! ty: type = "submite" th: value = "vá para a página do administrador"/> </form>-> <a th: href = "@{/admin}" rel = "nofollow externo"> vá para a página do usuário do administrador </a> <input th: type = "submit" onclick = "testPost ()" th: $ .ajax ({url: "/admin", type: 'post', sucesso: function (data) {}}); } </script> Clique no botão "Vá para a página do administrador" e você pode ver o seguinte na plataforma de depuração
Isso ocorre porque a estrutura impede a CSRF (falsificação de solicitação de solicitação entre sites) de ocorrer, limitando a maioria dos métodos, exceto GET.
Aqui está uma solução:
Primeiro, adicione o seguinte conteúdo na tag.
<meta name = "_ csrf" th: content = "$ {_ csrf.token}"/> <meta name = "_ csrf_hader" th: content = "$ {_ csrf.headername}"/> Enquanto esse token for adicionado, o plano de fundo verificará a correção desse token. Se estiver correto, aceitará o acesso postal.
Em seguida, adicione o código a seguir no código AJAX:
var token = $ ('meta [name = "_ csrf"]'). att ("content"); var cabeçalho = $ ('meta [name = "_ csrf_hader"]'). att ("content"); $ (document) .ajaxSend (function (e, xhr, opt); Dessa forma, você pode acessá -lo normalmente usando os métodos de postagem, exclusão e outros métodos.
O mencionado acima usando o método de formulário post para enviar. Você pode ver visualizando o código -fonte da página.
A estrutura insere automaticamente um campo oculto no formulário, e o valor do valor é o token; portanto, usar o formulário de formulário para enviar uma solicitação de postagem poderá ser passada diretamente e, se você o enviar de maneira Ajax, esse código precisará ser adicionado.
Ok, isso é tudo sobre este artigo. Mais tarde, haverá artigos sobre como usar a segurança da primavera para controlar as permissões no estilo da API REST.
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.