当前位置: 首页 > news >正文

展示型网站建设标准辽宁网站建设企业

展示型网站建设标准,辽宁网站建设企业,企业组织架构,铜陵app网站做招聘翻译版本 【spring-security 6.2.1 】session-managemen Authentication Persistence and Session Management 一旦您获得了一个正在对请求进行身份验证的应用程序#xff0c;就必须考虑如何在未来的请求中持久化和恢复所产生的身份验证。 默认情况下#xff0c;这是自动完…翻译版本 【spring-security 6.2.1 】session-managemen Authentication Persistence and Session Management 一旦您获得了一个正在对请求进行身份验证的应用程序就必须考虑如何在未来的请求中持久化和恢复所产生的身份验证。 默认情况下这是自动完成的所以不需要额外的代码但重要的是要知道requireExplicitSave在HttpSecurity中的含义。 如果你喜欢你可以关于requireExplicitSave是做什么的或者为什么它很重要。否则在大多数情况下您已经完成了这一部分。 但在你离开之前考虑一下这些用例是否适合你的应用: 我想了解会话管理的组件我想限制用户可以同时登录的次数我想自己直接存储身份验证而不是Spring Security为我做这件事我手动存储身份验证我想删除它我正在使用SessionManagementFilter我需要有关如何摆脱它的指导我希望将身份验证存储在会话之外的其他地方我正在使用无状态身份验证但我仍然希望将其存储在会话中我正在使用SessionCreationPolicy.NEVER但应用程序仍在创建会话。 Understanding Session Management’s Components 了解会话管理的组件 会话管理支持由几个组件组成这些组件协同工作以提供功能。这些组件是SecurityContextHolderFilter、SecurityContextPersistenceFilter和SessionManagementFilter。 注意 在Spring Security 6中SecurityContextPersistenceFilter和SessionManagementFilter是默认不设置的。除此之外任何应用程序都应该只设置SecurityContextHolderFilter或SecurityContextPersistenceFilter中的一个而不是同时设置。 The SessionManagementFilter SessionManagementFilter根据SecurityContextHolder的当前内容检查SecurityContextRepository的内容以确定用户在当前请求期间是否已通过身份验证通常通过非交互式身份验证机制如pre-authentication或 remember-me。如果存储库包含安全上下文则filter不执行任何操作。如果没有并且线程本地SecurityContext包含一个(non-anonymousAuthentication对象则filter假设它们已经由堆栈中的前一个filter进行了身份验证。然后它将调用已配置的SessionAuthenticationStrategy。 如果用户当前未通过身份验证则筛选器将检查是否请求了无效的会话ID例如由于超时并将调用配置的InvalidSessionStrategy如果已设置。最常见的行为只是重定向到一个固定的URL这被封装在标准实现SimpleRedirectInvalidSessionStrategy中。后者也用于通过命名空间配置无效会话URL如前所述。 Moving Away From SessionManagementFilter 远离SessionManagementFilter 在Spring Security 5中默认配置依赖于SessionManagementFilter来检测用户是否刚刚通过身份验证并调用SessionAuthenticationStrategy。问题在于这意味着在典型的设置中必须为每个请求读取HttpSession。 在SpringSecurity6中默认情况是身份验证机制本身必须调用SessionAuthenticationStrategy。这意味着不需要检测身份验证何时完成因此不需要为每个请求读取HttpSession。 Things To Consider When Moving Away From SessionManagementFilter 远离SessionManagementFilter时要考虑的事情 在Spring Security 6中默认情况下不使用SessionManagementFilter因此来自sessionManagement DSL的一些方法将不会产生任何影响。 Method替换sessionAuthenticationErrorUrl在身份验证机制中配置AuthenticationFailureHandlersessionAuthenticationFailureHandler在身份验证机制中配置AuthenticationFailureHandlersessionAuthenticationStrategy如上所述在身份验证机制中配置SessionAuthenticationStrategy 如果您尝试使用这些方法中的任何一个都会引发异常。 Customizing Where the Authentication Is Stored 自定义认证存储位置 默认情况下Spring Security在HTTP会话中为您存储安全上下文。然而这里有几个你可能想要定制的原因: 您可能需要在HttpSessionSecurityContextRepository实例上调用单独的setter您可能希望将安全上下文存储在缓存或数据库中以启用水平扩展 首先您需要创建SecurityContextRepository的实现或使用现有的实现如HttpSessionSecurityContextRepository然后您可以在HttpSecurity中设置它。 自定义SecurityContextRepository Bean public SecurityFilterChain filterChain(HttpSecurity http) {SecurityContextRepository repo new MyCustomSecurityContextRepository();http// ....securityContext((context) - context.securityContextRepository(repo));return http.build(); }注意 上面的配置将在SecurityContextHolderFilter和参与的身份验证filters如UsernamePasswordAuthenticationFilter上设置SecurityContextRepository。要在无状态筛选器中设置它请参阅如何为无状态身份验证自定义SecurityContextRepository。 Storing the Authentication manually 手动保存身份验证 例如在某些情况下您可能手动验证用户而不是依赖于Spring Security过滤器。您可以使用自定义过滤器或SpringMVC控制器端点来完成此操作。如果你想保存请求之间的身份验证例如在HttpSession中你必须这样做 private SecurityContextRepository securityContextRepository new HttpSessionSecurityContextRepository();// 1PostMapping(/login) public void login(RequestBody LoginRequest loginRequest, HttpServletRequest request, HttpServletResponse response) {// 2UsernamePasswordAuthenticationToken token UsernamePasswordAuthenticationToken.unauthenticated(loginRequest.getUsername(), loginRequest.getPassword());// 3Authentication authentication authenticationManager.authenticate(token);// 4SecurityContext context securityContextHolderStrategy.createEmptyContext();context.setAuthentication(authentication);// 5securityContextHolderStrategy.setContext(context);securityContextRepository.saveContext(context, request, response);// 6 }class LoginRequest {private String username;private String password;// getters and setters }将SecurityContextRepository添加到控制器注入HttpServletRequest和HttpServletResponse来保存SecurityContext使用提供的凭据创建未经身份验证的UsernamePasswordAuthenticationToken调用AuthenticationManager#authenticate对用户进行身份验证创建SecurityContext并在其中设置Authentication将SecurityContext保存在SecurityContextRepository中 就是这样。如果你不确定上面例子中的securityContextHolderStrategy是什么你可以在使用SecurityContextStrategy一节中关于它的信息。 Properly Clearing an Authentication 正确清除身份验证 如果您使用的是Spring Security的注销支持那么它会为您处理很多事情包括清除和保存上下文。但是假设您需要手动将用户从应用程序中注销。在这种情况下您需要确保正确地清除和保存上下文。 Configuring Persistence for Stateless Authentication 配置无状态认证的持久性 有时不需要创建和维护HttpSession例如在请求之间持久化身份验证。有些身份验证机制(如HTTP Basic)是无状态的因此在每次请求时都要重新对用户进行身份验证。 如果您不希望创建会话您可以使用SessionCreationPolicy.STATELESS像这样: Bean public SecurityFilterChain filterChain(HttpSecurity http) {http// ....sessionManagement((session) - session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));return http.build(); }上面的配置将SecurityContextRepository配置为使用NullSecurityContextRepository并且还阻止将请求保存在会话中。 如果您正在使用SessionCreationPolicy.NEVER您可能会注意到应用程序仍在创建HttpSession。在大多数情况下发生这种情况是因为请求保存在会话中以便在身份验证成功后重新请求经过身份验证的资源。要避免这种情况请参考如何防止被保存请求一节。 Storing Stateless Authentication in the Session 在会话中存储无状态身份验证 如果出于某种原因您正在使用无状态身份验证机制但仍希望将身份验证存储在会话中则可以使用HttpSessionSecurityContextRepository而不是NullSecurityContextRepository。 对于HTTP Basic你可以添加一个ObjectPostProcessor来改变BasicAuthenticationFilter使用的SecurityContextRepository: 在HttpSession中存储HTTP Base 身份验证 Bean SecurityFilterChain web(HttpSecurity http) throws Exception {http// ....httpBasic((basic) - basic.addObjectPostProcessor(new ObjectPostProcessorBasicAuthenticationFilter() {Overridepublic O extends BasicAuthenticationFilter O postProcess(O filter) {filter.setSecurityContextRepository(new HttpSessionSecurityContextRepository());return filter;}}));return http.build(); }上述内容也适用于其他认证机制如Bearer Token Authentication。 Understanding Require Explicit Save 了解需要显式保存 在SpringSecurity5中默认行为是使用SecurityContextPersistenceFilter将SecurityContext自动保存到SecurityContextRepository。保存必须在提交HttpServletResponse 之前和SecurityContextPersistenceFilter之前完成。不幸的是当SecurityContext的自动持久化在请求完成之前即在提交HttpServletResponse 之前完成时可能会让用户感到惊讶。跟踪状态以确定是否需要保存也很复杂有时会导致对SecurityContextRepository即HttpSession进行不必要的写入。 出于这些原因SecurityContextPersistenceFilter已被弃用取而代之的是SecurityContextHolderFilter。在Spring Security 6中默认行为是SecurityContextHolderFilter将仅从SecurityContextRepository读取SecurityContext并将其填充到SecurityContextHolder中。如果用户希望SecurityContext在请求之间保持不变那么他们现在必须显式地将SecurityContext与SecurityContextRepository一起保存。这消除了歧义并通过只在必要时要求写入SecurityContextRepository即HttpSession来提高性能。 How it works 它是如何工作的 总而言之当requireExplicitSave为true时Spring Security会设置SecurityContextHolderFilter而不是SecurityContextPersistenceFilter。 Configuring Concurrent Session Control 配置并发会话控制 如果您希望对单个用户登录应用程序的能力施加限制Spring Security通过以下简单的添加支持开箱即用。首先你需要在你的配置中添加以下侦听器以保持Spring Security对会话生命周期事件的更新: Bean public HttpSessionEventPublisher httpSessionEventPublisher() {return new HttpSessionEventPublisher(); }然后将以下行添加到安全配置中 Bean public SecurityFilterChain filterChain(HttpSecurity http) {http.sessionManagement(session - session.maximumSessions(1));return http.build(); }这将防止用户多次登录—第二次登录将导致第一次登录无效。 使用Spring Boot您可以通过以下方式测试上述配置场景 SpringBootTest(webEnvironment SpringBootTest.WebEnvironment.RANDOM_PORT) AutoConfigureMockMvc public class MaximumSessionsTests {Autowiredprivate MockMvc mvc;Testvoid loginOnSecondLoginThenFirstSessionTerminated() throws Exception {MvcResult mvcResult this.mvc.perform(formLogin()).andExpect(authenticated()).andReturn();MockHttpSession firstLoginSession (MockHttpSession) mvcResult.getRequest().getSession();this.mvc.perform(get(/).session(firstLoginSession)).andExpect(authenticated());this.mvc.perform(formLogin()).andExpect(authenticated());// first session is terminated by second loginthis.mvc.perform(get(/).session(firstLoginSession)).andExpect(unauthenticated());}}您可以使用Maximum Sessions示例进行尝试。 同样常见的情况是您希望阻止第二次登录在这种情况下您可以使用 Bean public SecurityFilterChain filterChain(HttpSecurity http) {http.sessionManagement(session - session.maximumSessions(1).maxSessionsPreventsLogin(true));return http.build(); }第二次登录将被拒绝。通过“拒绝”我们的意思是如果使用基于表单的登录用户将被发送到authentication-failure-url。如果通过另一种非交互机制(如“remember-me”)进行第二次身份验证则将向客户端发送“unauthorized”(401)错误。如果希望使用错误页面则可以向会话管理元素添加属性session-authentication-error-url。 使用Spring Boot您可以通过以下方式测试上述配置: SpringBootTest(webEnvironment SpringBootTest.WebEnvironment.RANDOM_PORT) AutoConfigureMockMvc public class MaximumSessionsPreventLoginTests {Autowiredprivate MockMvc mvc;Testvoid loginOnSecondLoginThenPreventLogin() throws Exception {MvcResult mvcResult this.mvc.perform(formLogin()).andExpect(authenticated()).andReturn();MockHttpSession firstLoginSession (MockHttpSession) mvcResult.getRequest().getSession();this.mvc.perform(get(/).session(firstLoginSession)).andExpect(authenticated());// second login is preventedthis.mvc.perform(formLogin()).andExpect(unauthenticated());// first session is still validthis.mvc.perform(get(/).session(firstLoginSession)).andExpect(authenticated());}}如果您使用自定义的身份验证过滤器进行基于表单的登录则必须显式配置并发会话控制支持。您可以使用“最大会话阻止登录”示例进行尝试。 Detecting Timeouts (检测超时) 会话会自行过期无需采取任何措施来确保删除安全上下文。也就是说Spring Security可以检测会话何时过期并采取您指示的特定操作。例如当用户使用已过期的会话发出请求时您可能希望重定向到特定的端点。这是通过HttpSecurity中的invalidSessionUrl实现的 Bean public SecurityFilterChain filterChain(HttpSecurity http) {http.sessionManagement(session - session.invalidSessionUrl(/invalidSession));return http.build(); }请注意如果使用此机制检测会话超时如果用户退出登录然后在不关闭浏览器的情况下重新登录则可能错误地报告错误。这是因为会话cookie在会话无效时不会被清除即使用户已经注销也会被重新提交。如果是这种情况您可能需要配置注销以清除会话cookie。 Customizing the Invalid Session Strategy (自定义无效会话策略) invalidSessionUrl是使用SimpleRedirectInvalidSessionStrategy实现设置InvalidSessionStrategy的方便方法。如果你想自定义行为你可以实现InvalidSessionStrategy接口并使用InvalidSessionStrategy方法配置它: Bean public SecurityFilterChain filterChain(HttpSecurity http) {http.sessionManagement(session - session.invalidSessionStrategy(new MyCustomInvalidSessionStrategy()));return http.build(); }Clearing Session Cookies on Logout (注销时清除会话Cookie) 你可以在注销时显式地删除JSESSIONID cookie例如在注销处理程序中使用Clear-Site-Data头: Bean public SecurityFilterChain filterChain(HttpSecurity http) {http.logout((logout) - logout.addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(COOKIES))));return http.build(); }这样做的优点是与容器无关并且可以与任何支持Clear-Site-Data头的容器一起工作。 作为替代方案您还可以在注销处理程序中使用以下语法: Bean public SecurityFilterChain filterChain(HttpSecurity http) {http.logout(logout - logout.deleteCookies(JSESSIONID));return http.build(); }不幸的是不能保证这对每个servlet容器都有效因此需要在您的环境中进行测试。 注意 如果您在代理服务器后面运行应用程序您还可以通过配置代理服务器来删除会话cookie。例如通过使用Apache HTTPD的mod_headers以下指令通过在响应注销请求时使JSESSIONID cookie过期来删除该cookie假设应用程序部署在/tutorial路径下 LocationMatch /tutorial/logout Header always set Set-Cookie JSESSIONID;Path/tutorial;ExpiresThu, 01 Jan 1970 00:00:00 GMT /LocationMatch有关“清除站点数据”和“注销”部分的更多详细信息。 Understanding Session Fixation Attack Protection 了解会话固定攻击保护 会话固定攻击是一种潜在的风险恶意攻击者可能通过访问网站创建会话然后说服另一个用户使用同一会话登录例如通过向他们发送包含会话标识符作为参数的链接。Spring Security通过创建新会话或在用户登录时更改会话ID来自动防止这种情况发生。 Configuring Session Fixation Protection 配置会话固定保护 您可以通过选择以下三个推荐选项来控制会话固定保护策略: changeSessionId -不创建新会话。相反使用Servlet容器提供的会话固定保护(HttpServletRequest#changeSessionId())。此选项仅在Servlet 3.1 (Java EE 7)和更新的容器中可用。在旧的容器中指定它将导致异常。这是Servlet 3.1和更新的容器中的默认值。newSession -创建一个新的“干净”会话不复制现有会话数据(Spring security相关属性仍将被复制)。migrateSession -创建一个新会话并将所有现有会话属性复制到新会话。这是Servlet 3.0或更早的容器中的默认值。 您可以通过执行以下操作来配置会话固定保护 Bean public SecurityFilterChain filterChain(HttpSecurity http) {http.sessionManagement((session) - session.sessionFixation((sessionFixation) - sessionFixation.newSession()));return http.build(); }发生会话固定保护时会导致在应用程序上下文中发布SessionFixationProtectionEvent。如果您使用changeSessionId这种保护也会导致任何jakarta.servlet.http.HttpSessionIdListeners收到通知因此如果您的代码同时侦听这两个事件请小心。 您也可以将会话固定保护设置为none来禁用它但不建议这样做因为这会使您的应用程序容易受到攻击。 Using SecurityContextHolderStrategy 考虑以下代码块 UsernamePasswordAuthenticationToken token new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()); Authentication authentication this.authenticationManager.authenticate(token); // ... SecurityContext context SecurityContextHolder.createEmptyContext();// 1 context.setAuthentication(authentication);// 2 SecurityContextHolder.setContext(context);// 3通过静态访问SecurityContextHolder来创建一个空的SecurityContext实例。设置SecurityContext实例中的Authentication对象。静态设置SecurityContextHolder中的SecurityContext实例。 虽然上面的代码运行良好但它可能会产生一些不希望的效果当组件通过SecurityContextHolder静态访问SecurityContext时当有多个应用程序上下文想要指定SecurityContextHolderStrategy时这可能会创建竞争条件。这是因为在SecurityContextHolder中每个类加载器有一个策略而不是每个应用程序上下文有一个。 为了解决这个问题组件可以从应用程序上下文连接SecurityContextHolderStrategy。默认情况下他们仍然会从SecurityContextHolder中查找策略。 这些更改主要是在内部进行的但是它们为应用程序提供了自动使用SecurityContextHolderStrategy而不是静态访问SecurityContext的机会。为此您应该将代码更改为以下内容: public class SomeClass {private final SecurityContextHolderStrategy securityContextHolderStrategy SecurityContextHolder.getContextHolderStrategy();public void someMethod() {UsernamePasswordAuthenticationToken token UsernamePasswordAuthenticationToken.unauthenticated(loginRequest.getUsername(), loginRequest.getPassword());Authentication authentication this.authenticationManager.authenticate(token);// ...SecurityContext context this.securityContextHolderStrategy.createEmptyContext();// 1context.setAuthentication(authentication);// 2this.securityContextHolderStrategy.setContext(context);// 3}}使用配置的SecurityContextHolderStrategy创建一个空的SecurityContext实例。在SecurityContext实例中设置Authentication对象。在SecurityContextHolderStrategy中设置SecurityContext实例。 Forcing Eager Session Creation 强制创建急切会话 有时候急切地创建会话是很有价值的。这可以通过使用ForceEagerSessionCreationFilter来实现它可以这样配置: Bean public SecurityFilterChain filterChain(HttpSecurity http) {http.sessionManagement(session - session.sessionCreationPolicy(SessionCreationPolicy.ALWAYS));return http.build(); }What to read next 接下来要读什么 与Spring Session的集群会话 SessionManagementFilter不会检测到在身份验证之后执行重定向的机制进行的身份验证(例如表单登录)因为在身份验证请求期间不会调用过滤器。在这些情况下会话管理功能必须单独处理。
http://www.pierceye.com/news/564765/

相关文章:

  • 西安市建设局官方网站做词云的网站
  • 网站开发人员岗位要求马洪旭 做的网站大学
  • 凡科做网站是否安全网站效果代码
  • 腾讯云做网站干什么用公司的网站建设规划书
  • 网页设计如何设置背景北京建站优化
  • 哈尔滨企业建站模板做emu对网站有什么要求
  • 网站说服力 营销...企业微信自建应用怎么开发
  • 做网站的宽度为多少做义工的网站
  • 现在怎么做网站东莞家居网站建设
  • 制作公司网站的流程代运营公司网站
  • 山东网站策划怎么做58同城黄页推广
  • 如何用手机做钓鱼网站贵阳建设厅网站
  • 网站建设工作自查报告网站建设的心得体会
  • 网站开发项目设计文档产品seo基础优化
  • 建筑工程招聘网站哪个好wordpress ssr
  • 制作一个网站平台做php网站需要什么软件开发
  • 长沙seo网站管理淮北论坛招聘最新消息兼职
  • .net网站源码下载珠海网站建设珠海
  • 网站被降权严重吗企业营销型网站的内容
  • 网站抓取qq号码原理社交电商平台排行榜
  • 贵阳做网站哪家公司好dw如何在网站做弹窗
  • 怎样做网站底部导航网站建设软件sh
  • 小白学网站建设与设计书如何制作app软件下载
  • 个人网站模板源码一般vs做的网站的总体框架
  • 服务器做网站流程wordpress分站
  • 电子商务平台网站建造莒南做网站
  • 网站文章好几天不收录注册送38元的游戏网站
  • 手机营销型网站建设定制一款软件需要多少钱
  • 网站备案增加域名解析电子信息工程移动互联网 学什么
  • 怎么在网站视频做字幕河北唐山建设工程协会网站