宁波哪家做网站好,广西住房和城乡建设厅网站证件,深圳西乡 网站建设,中国软件邮箱登录入口前言
Spring Security是一个用于在Java应用程序中提供身份验证和授权功能的强大框架。它构建在Spring框架之上#xff0c;为开发人员提供了一套灵活且全面的安全性服务#xff0c;本篇将为大家带来Spring Security的详细介绍及入门 一.安全框架
在学习了解Spring Security之…前言
Spring Security是一个用于在Java应用程序中提供身份验证和授权功能的强大框架。它构建在Spring框架之上为开发人员提供了一套灵活且全面的安全性服务本篇将为大家带来Spring Security的详细介绍及入门 一.安全框架
在学习了解Spring Security之前先了解什么是安全框架。安全框架顾名思义就是解决系统安全问题的框架。任何应用开发的计划阶段都应该确定一组特定的安全需求如身份验证、授权和加密方式。不使用安全框架之前我们需要手动处理每个资源的访问控制针对不同的项目都需要做不同的处理此时就会显得非常麻烦并且低效率引起的额外开销会延缓开发周期。使用安全框架使开发团队能够选择最适合这些需求的框架可以通过配置的方式实现对资源的访问限制使得开发更加的高效。
二.主流安全框架
1.Spring Security Spring Security是目前Java Web领域中最流行的框架之一它提供了一系列安全级别包括基于认证和授权的安全保护以及各种各样的安全校验使得开发人员可以非常容易地为应用程序添加安全保护。Spring Security也提供了一种简单易用的方式来定制其过滤器链以适应具体的安全需求。 2.Apache Shiro Apache Shiro是一个易于使用的Java Web安全框架。它提供了一种简单的方式来管理应用程序中的身份验证、授权和加密。Apache Shiro可以轻松地集成到Spring中并提供了一系列构建块以便定制其安全性行为。 3.JSON Web Token (JWT)
1不是一个完整的安全框架但是被广泛用于在客户端和服务器之间安全地传递信息。
2常用于身份验证和声明传递。
JWT在前面的文章有过详细介绍这里就不过多详述
文章链接一篇文章让你了解“JWT“-CSDN博客 三.为什么选择Spring Security
在介绍了这么多的主流安全框架为什么要选择Spring Security呢 SpringBoot 没有发布之前Shiro 应用更加广泛因为 Shiro 是一个强大且易用的 Java 安全框架能够非常清晰的处理身份验证、授权、管理会话以及密码加密。利用其易于理解的API可以快速、轻松地获得任何应用程序从最小的移动应用程序到最大的网络和企业应用程序。但是 Shiro 只是一个框架而已其中的内容需要自己的去构建前后是自己的中间是Shiro帮我们去搭建和配置好的。 SpringBoot 发布后随着其快速发展Spring Security前身叫做Acegi Security 重新进入人们的视野。SpringBoot 解决了 Spring Security 各种复杂的配置Spring Security 在我们进行用户认证以及授予权限的时候通过各种各样的拦截器来控制权限的访问从而实现安全也就是说 Spring Security 除了不能脱离 SpringShiro 的功能它都有。 在用户认证方面Spring Security 框架支持主流的认证方式包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。 在用户授权方面Spring Security 提供了基于角色的访问控制和访问控制列表Access Control ListACL可以对应用中的领域对象进行细粒度的控制。 而对于Shiro而言Shiro在这个环境下实际已经不具备优势了。因为Spring这个生态链现在是太强大了。 四.SpringSecurity讲解
1.什么是SpringSecurity? Spring Security是一个基于Spring框架的安全性框架可用于对Java应用程序进行身份验证、授权和其他安全性功能的添加。它不仅可以对Web应用程序进行保护还可以保护非Web环境下的应用程序如远程服务和命令行应用程序等。Spring Security提供了一系列可插拔的安全性特性如基于标记的身份验证、权限控制、单点登录、密码加密等。它还支持多种安全性协议和标准如OAuth、SAML、OpenID等可与各种身份提供商集成。 2.工作原理
权限框架一般包含两大核心模块认证Authentication和鉴权Authorization。 认证认证模块负责验证用户身份的合法性生成认证令牌并保存到服务端会话中如TLS。 鉴权鉴权模块负责从服务端会话内获取用户身份信息与访问的资源进行权限比对。 核心组件介绍 AuthenticationManager管理身份验证可以从多种身份验证方案中选择一种。 Authentication用于验证用户的身份。 SecurityContextHolder用于管理 SecurityContext 的 ThreadLocal以便在整个请求上下文中进行访问方便用户访问。 AccessDecisionManager负责对访问受保护的资源的请求进行决策即决定是否允许用户访问资源 AccessDecisionVoter是AccessDecisionManager的实现组件之一它用于对用户请求的访问受保护的资源所需要的角色或权限进行投票。 ConfigAttribute用于表示受保护资源或URL需要的访问权限它可以理解为是访问控制策略的一部分 工作步骤 用户认证当用户尝试访问受保护的资源时Spring Security首先会进行用户认证。用户提供的用户名和密码将被验证并与存储在数据库或其他身份验证来源中的用户凭据进行比较。 认证成功处理如果用户的认证成功Spring Security将生成一个安全上下文SecurityContext其中包含用户的身份信息和授权信息。这个上下文将被存储在安全上下文持有者SecurityContextHolder中以供后续的请求使用。 授权处理一旦用户通过认证Spring Security将根据用户的角色和权限来判断用户是否有权访问请求的资源。它可以通过注解、配置文件或编程方式来配置授权规则。如果用户被授予访问资源的权限Spring Security将允许用户继续请求。 认证失败处理如果用户的认证失败Spring Security将根据配置的处理方式返回响应例如重定向到登录页面、返回错误信息等。 安全上下文传递在整个请求处理过程中Spring Security将安全上下文传递给其他组件以确保每个组件都可以访问到用户的身份信息和授权信息。这样在业务逻辑层、控制器层和视图层等各个组件中都可以使用安全上下文来进行身份验证和授权的处理。
3.快速入门
3.1 基于SpringBoot创建项目
创建SpringBoot所需要导入的依赖
!-- freemarker --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-freemarker/artifactId
/dependency
!-- web --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
!-- lombok --
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope
/dependency
配置application.yml 文件
spring:freemarker:# 设置freemarker模板后缀suffix: .ftl# 设置freemarker模板前缀template-loader-path: classpath:/templates/enabled: true
3.2 配置Spring Security
导入Spring Security依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-security/artifactId
/dependency
依赖详解 spring-security-coreSpring Security的核心模块提供了基于权限的访问控制以及其他安全相关功能。 spring-security-config提供了Spring Security的配置实现例如通过Java配置创建安全策略和配置Token存储等。 spring-security-web提供了Spring Security Web的基本功能例如Servlet集成和通过HttpSecurity配置应用程序安全策略。 在application.yml文件中配置自定义用户名和密码
spring:security:user:name: adminpassword: 123456
4.Web安全配置类
4.1HttpSecurity介绍
HttpSecurity 是 Spring Security 的一个核心类用于配置应用程序的安全策略。
HttpSecurity 类通常包含许多方法可以用于配置以下内容 HTTP 请求的安全策略例如访问控制、跨站点请求伪造 (CSRF) 防护等。 HTTP 验证的安全策略例如基于表单、HTTP 基本身份验证、OAuth 等。 访问受保护资源时所需的身份验证和授权方式。
方法说明authorizeRequests()用于配置如何处理请求的授权默认情况下所有的请求都需要进行认证和授权才能访问受保护的资源formLogin()用于配置基于表单的身份验证包括自定义登录页面、登录请求路径、用户名和密码的参数名称、登录成功和失败的跳转等。httpBasic()用于配置基于HTTP Basic身份验证包括定义使用的用户名和密码、realm名称等。logout()用于配置退出登录功能包括定义退出登录请求的URL、注销成功后的跳转URL、清除会话、删除Remember-Me令牌等。csrf()用于配置跨站请求伪造保护包括定义CSRF Token的名称、保存方式、忽略某些请求等。sessionManagement()用于配置会话管理包括定义并发控制、会话失效、禁用URL重定向、会话固定保护等。rememberMe()用于配置Remember-Me功能包括定义Remember-Me令牌的名称、有效期、加密方法、登录成功后的处理方式等。exceptionHandling()用于配置自定义的异常处理包括定义异常处理器和异常处理页面等。headers()用于配置HTTP响应头信息包括定义X-Content-Type-Options、X-XSS-Protection、Strict-Transport-Security等头信息。cors()用于配置跨域资源共享包括定义可访问的来源、Headers等。addFilter()用于向当前HttpSecurity中添加自定义的Filter。and()用于在配置中添加另一个安全规则并将两个规则合并。 匹配规则 URL匹配
方法说明requestMatchers()配置一个request Mather数组参数为RequestMatcher对象其match规则自定义,需要的时候放在最前面对需要匹配的的规则进行自定义与过滤authorizeRequests()URL权限配置antMatchers()配置一个request Mather的string数组参数为ant路径格式 直接匹配urlanyRequest()匹配任意url无参 ,最好放在最后面 保护URL
方法说明authenticated()保护Url需要用户登录permitAll()指定URL无需保护一般应用与静态资源文件hasRole(String role)限制单个角色访问hasAnyRole(String… roles)允许多个角色访问access(String attribute)该方法使用 SPEL, 所以可以创建复杂的限制hasIpAddress(String ipaddressExpression)限制IP地址或子网 登录formLogin
方法说明loginPage()设置登录页面的 URLdefaultSuccessUrl()设置登录成功后的默认跳转页面failuerHandler()登录失败之后的处理器successHandler()登录成功之后的处理器failuerUrl()登录失败之后系统转向的url默认是this.loginPage “?error”loginProcessingUrl()设置登录请求的 URL即表单提交的 URLusernameParameter()设置登录表单中用户名字段的参数名默认为 usernamepasswordParameter()设置登录表单中密码字段的参数名默认为 password 登出logout
方法说明logoutUrl()登出url 默认是/logoutllogoutSuccessUrl()登出成功后跳转的 url 默认是/login?logoutlogoutSuccessHandler()登出成功处理器设置后会把logoutSuccessUrl 置为null
4.2 自定义登录
1.创建SecurityConfig配置类
创建WebSecurityConfig配置类设置EnableWebSecurity注解开启Spring Security的默认行为。
package com.yu.security.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;Configuration //声明为配置类与Spring绑定一起启动
EnableWebSecurity //开启SpringSecurity的默认行为
public class WebSecurityConfig {Beanpublic PasswordEncoder bcryptPasswordEncoder() {return new BCryptPasswordEncoder();}Beanpublic UserDetailsService userDetailsService() {UserDetails admin User.withUsername(admin).password(bcryptPasswordEncoder().encode(123456)).roles(ADMIN, USER).build();UserDetails user User.withUsername(user).password(bcryptPasswordEncoder().encode(123456)).roles(USER).build();return new InMemoryUserDetailsManager(admin, user);}Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers(/toLogin).permitAll().antMatchers(/admin/**).hasRole(ADMIN).antMatchers(/user/**).hasAnyRole(ADMIN, USER).anyRequest().authenticated().and().formLogin().loginPage(/toLogin).loginProcessingUrl(/userLogin).usernameParameter(username).passwordParameter(password).and().logout().logoutUrl(/logout).logoutSuccessUrl(/);return http.build();}}
2.创建Controller
控制路由
Controller
public class UserController {RequestMapping(/toLogin)public String toLogin(){return login;}RequestMapping(/userLogin)public String userLogin(String username,String password){System.out.println(usernameusername,passwordpassword);return index;}RequestMapping(/admin/toAddUser)public String toAddUser(){return admin/addUser;}RequestMapping(/admin/toListUser)public String toListUser(){return admin/listUser;}RequestMapping(/admin/toResetPwd)public String toResetPwd(){return admin/resetPwd;}RequestMapping(/admin/toUpdateUser)public String toUpdateUser(){return admin/updateUser;}RequestMapping(/user/toUpdatePwd)public String toUpdatePwd(){return user/updatePwd;}
}
3.登录模板页面
h1用户登录/h1
form action/userLogin methodpostlabel用户/labelinput typetext nameusername/br/label密码/labelinput typepassword namepassword/br/input typesubmit value登录/
/form
4.配置多角色访问
在application.yml文件进行配置
spring:freemarker:suffix: .ftltemplate-loader-path: classpath:/templates/enabled: true
5.配置自定义异常处理器
修改SecurityConfig配置类添加自定义异常处理并设置异常处理页面。
http.exceptionHandling().accessDeniedPage(/noAccess); 当我们做权限管理时普通用户误操作其他管理员界面会进行异常跳转页面处理这个要根据实际情况实际考虑 4.3异常小结 重启项目跳转登录页重新登录。这时发现登录不成功后台控制台也没有产生任何异常信息通过浏览器的网络(network)查看现实登录请求接口302错误。 解决方案关闭csrf 修改SecurityConfig配置类添加关闭csrf配置。 http.csrf().disable(); 总结
Spring Security可以很好得保证我们的安全性问题但是在本次的自定义登录中还是要注意
1.因为使用的是模拟登录所以在实际操作创建用户时还是要按正规程序执行并将限制用户进行传参验证
2.在Controller层中配置创建路由时要注意路由名称配置模板信息要与yml配置文件一致