在一个系统中认证和授权是常有的事情,现在比较流行的框架有spring security、shiro等等。他们都能很好的帮助我们完成认证和授权的功能。那么假如说让我们自己完成一个登录那么应该大致的流程是怎么样的呢?
一、我们肯定有一个处理页面上表单提交的url处理器,此处我们放置在Filter中进行处理,假如就叫做UsernamePasswordAuthenticationFilter ,在这个Filter里面我们需要将用户提交上来的用户名和密码封装成一个对象,假如叫做UsernamePasswordAuthenticationToken。
二、有了上一步的 UsernamePasswordAuthenticationToken 之后,我们肯定要对这个token进行一个认证,那UsernamePasswordAuthenticationFilter中就必须要有一个认证管理器(AuthenticationManager),来处理我们这个token的认证。
三、有了认证管理器后,那这个认证管理器可能可以处理多种方式的登录,比如基于ip地址的登录、基于用户名和密码的登录、基于remember me(记住我)的登录等等。那么在我们的认证管理器的实现中(ProviderManager)就应该存在一组AuthenticationProvider,每个AuthenticationProvider处理不同的Token认证。
比如:DaoAuthenticationProvider用于处理UsernamePasswordAuthenticationToken
RememberMeAuthenticationProvider用于处理RememberMeAuthenticationToken
四、当我们是基于用户名和密码登录认证时,那么对应的AuthenticationProvider就是DaoAuthenticationProvider, 那么我们肯定有一个接口根据用户输入的用户名返回一个用户对象即 UserDetailsService#loadUserByUsername(String) 接口,返回一个UserDetails 对象,有了用户对象后,我们系统中密码肯定是加密过的,那么就必须还要一个密码加密器PasswordEncoder,用于进行密码的校验。
五、当完成上面的认证后
成功认证:那么肯定有一个成功后的回调,加入是 AuthenticationFailureHandler , 在这个里面我们可以完成成功后页面的跳转
认证失败:也有一个失败的回调,假如是 AuthenticationFailureHandler,可以记录失败的日志,完成失败后的跳转
有了上面的初步认识后,我们来看一下在spring security中是如何做的。
一、引入spring security的pom配置文件
<dependencyManagement> <dependencies> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>Brussels-SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
二、进行spring security的配置
/** * spring security 的配置 * * @描述 * @作者 huan * @时间 2017年11月1日 - 下午9:33:59 */ @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(createUserDetailService())// .passwordEncoder(passwordEncoder())// .and()// .inMemoryAuthentication()// .withUser("admin") .password("admin") .roles("ADMIN");// 配置一个拥有用户名和密码的用户 } @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() // 表单登录 .loginProcessingUrl("/login")// 处理登录的请求 .loginPage("/login.html") // 自定义登录界面 .usernameParameter("authUsername")//登录表单的用户名的name的值 .passwordParameter("authPassword")//登录表单密码的name的值 .successHandler(securityAuthenticationSuccessHandler())// 认证成功后的处理 .failureHandler(securityAuthenticationFailureHandler()) // 认证失败后的处理 .and()// .userDetailsService(createUserDetailService()) // 用户服务,根据用户名加载用户信息 .logout() // 登出 .logoutUrl("/logout") // 登出的url路径 .addLogoutHandler(securityLogoutHandler())//登出时的处理操作 .clearAuthentication(true)// 清除认证 .invalidateHttpSession(true)// session失效 .and()// .csrf() // csrf .disable()// .authorizeRequests()// .antMatchers("/login.html","/login").permitAll() // 可匿名访问 .anyRequest().authenticated() // 除了上方的请求,其余的请求需要认证才可以访问 .and()// .exceptionHandling()// .accessDeniedPage("/403.html"); // 没有权限访问的页面 } @Bean public AuthenticationFailureHandler securityAuthenticationFailureHandler() { SecurityAuthenticationFailureHandler authenticationFailureHandler = new SecurityAuthenticationFailureHandler(); authenticationFailureHandler.setDefaultFailureUrl("/login.html?error"); return authenticationFailureHandler; } @Bean public AuthenticationSuccessHandler securityAuthenticationSuccessHandler() { SecurityAuthenticationSuccessHandler authenticationSuccessHandler = new SecurityAuthenticationSuccessHandler(); authenticationSuccessHandler.setAlwaysUseDefaultTargetUrl(true); authenticationSuccessHandler.setDefaultTargetUrl("/index.html"); return authenticationSuccessHandler; } @Bean public LogoutHandler securityLogoutHandler() { return new SecurityLogoutHandler(); } @Bean public UserDetailsService createUserDetailService() { return new SecurityUserDetailServiceImpl(passwordEncoder()); } /** 密码加密器 */ @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
三、各个实体类
四、登录页
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>用户登录</title> </head> <body> <form action="/login" method="post"> 用户名:<input type="text" name="authUsername" /><br /> 密码:<input type="password" name="authPassword" /><br/> <input type="submit" value="登录"> </form> </body> </html>
五、首页
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>首页</title> <link rel="stylesheet" type="text/css" href="/static/css/index.css"> </head> <body> <h1> 登录成功。<a href="/logout">退出</a> </h1> </body> </html>
六、界面效果
登录页
登录成功后的首页
相关推荐
在 `HelloSpringSecurity` 文件中,你可能看到以下关键代码: - **WebSecurityConfigurerAdapter** 类:这是 Spring Security 提供的配置适配器,可以覆盖其方法来定制安全规则。 - `configure(HttpSecurity http)...
**Spring Security 入门实例详解** Spring Security 是一个强大的安全框架,用于保护...通过学习这个实例,你将对 Spring Security 有一个基础的认识,并能将其应用到实际项目中,为你的 Web 应用构建稳固的安全防护。
Spring Security是Java EE应用中广泛使用的一个安全框架,旨在为基于Spring的应用程序提供全面的安全保障。它提供了全面、可配置的安全...这些知识点有助于读者全面认识Spring Security框架,并引导读者进行系统学习。
总的来说,理解并掌握Spring Security的权限管理机制,需要对`UserDetails`接口、配置文件的解析以及数据库交互有深入的认识。通过自定义用户实体、配置安全规则以及实现数据访问层,我们可以构建出满足业务需求的...
通过这个项目,初学者不仅能掌握SpringBoot的基础应用,还能深入理解SpringSecurity的权限控制机制,同时对JWT的原理和使用有了直观的认识。实践过程中,还需要了解数据库操作、HTTP协议、JSON格式等相关知识,对...
- 在web.xml中配置DelegatingFilterProxy来代理SpringSecurity中的核心部分过滤器,以及如何让这些过滤器获得Spring的webApplicationContext生命周期支持。 - 在Spring配置文件中引入SpringSecurity命名空间,并进行...
【标题】"Spring Boot + MyBatis + Security 登陆查询数据库验证"是一个初学者友好的实战项目,旨在演示如何在Spring Boot应用中整合MyBatis作为持久层框架,并利用Spring Security进行用户身份验证。这个项目涵盖了...
1. **Spring概述**:首先介绍Spring的发展历程、核心理念以及在现代软件开发中的地位,让读者对Spring有一个整体的认识。 2. **环境配置**:详细阐述如何搭建Spring开发环境,包括安装JDK、设置开发工具(如IDEA或...
除了上述内容,书中的案例涵盖了Spring的应用上下文、Bean的生命周期管理、Spring的测试支持以及Spring与其他技术的整合,如Spring Security(安全框架)、Spring Batch(批量处理)等。这些章节旨在让读者全面掌握...
通过学习这部分内容,读者可以建立起对Spring框架的整体认识,为后续的深入学习和实践打下坚实的基础。而"Spring揭秘部分2"和"Spring揭秘部分3"则可能进一步探讨Spring的其他模块和高级特性,如Spring Boot、Spring ...
通过学习以上知识点,并结合提供的"spring思维导图",读者可以更好地构建对Spring的整体认识,理解其设计理念,提升在实际项目中的应用能力。在实践中不断探索,Spring的奥秘会逐步揭示,成为你开发路上的强大助手。
通过学习这个"Spring4框架系列[ 1 ]",初学者可以建立起对Spring框架的基本认识,并逐步掌握如何在实际项目中利用Spring进行高效开发。后续章节可能会深入讲解更多高级特性,如数据访问集成、事务管理、Spring Boot...
"spring-framework-reference"文档中详细介绍了Spring的核心特性,包括Bean的声明和管理、Spring MVC的使用、数据访问支持(如JDBC、Hibernate集成)以及Spring的其他模块,如Spring Boot和Spring Security。...
认识 Spring 来认识 Spring 的一些特性,并初步了解一下什么叫作 IoC?什么叫作 DI? 简介 Spring Inversion of Control Dependency Injection <br> 核心容器 Spring 核心容器实作...
通过这份入门培训,读者应该能建立起对Spring Boot和ExtJS6.2的基础认识,掌握创建简单Web应用的能力,并能进行基本的调试和测试。源代码的提供则为学习者提供了动手实践的机会,有助于理论与实践的结合,加深理解。
在本教程中,我们将深入探讨"Spring简单项目源码(一)",这是一个专为初学者设计的示例,旨在帮助他们理解Spring...随着学习的深入,还可以探索Spring的更多高级特性,如Spring Boot、Spring Data、Spring Security等。
Spring框架是Java开发中的核心组件,它为应用...通过观看并实践教程中的示例,你将对Spring有更全面、深入的认识,从而在工作中更加得心应手。记得通过提供的百度网盘链接下载学习资源,以便随时回顾和巩固所学知识。