java - 如何重定向到一个简单的页面?
问题描述
我正在使用 Spring Security,但我遇到了一个大问题。
用户登录并关闭页面后,当他再次进入“mysite.com”时,他应该被重定向到“/dashboard”,但他收到错误 404,找不到页面。
他再次登录的唯一方法是使用其他浏览器或服务器。
我的配置有什么问题??如果他已经登录,它不会重定向到 /dashboard。
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/settings", "/users", "/teams", "/docker-status", "/container-creation").hasAuthority("Administrator")
.anyRequest().authenticated()
.and()
.formLogin().permitAll()
.loginPage("/login").permitAll()
.defaultSuccessUrl("/dashboard")
.failureUrl("/login?error")
.successHandler(authenticationSuccessHandler)
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.logoutSuccessHandler(logoutSuccessHandler)
.and()
.exceptionHandling().accessDeniedHandler(accessDeniedHandler);
}
解决方案
表单和基本登录选项
当提示您登录时,您可能想知道登录表单是从哪里来的,因为我们没有提到任何 HTML 文件或 JSP。事实上,由于我们没有为登录页面显式设置 URL,Spring Security 会自动生成一个,基于启用的功能并使用处理提交登录的 URL 的标准值,用户将使用的默认目标 URL登录后发送到等等。但是,命名空间提供了大量支持以允许您自定义这些选项。例如,如果您想提供自己的登录页面,您可以使用:
<http>
<intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page='/login.jsp'/>
</http>
另请注意,我们添加了一个额外的intercept-url元素来说明对登录页面的任何请求都应该可供匿名用户使用 [3] 以及 AuthenticatedVoter 类,以获取有关如何处理 IS_AUTHENTICATED_ANONYMOUSLY 值的更多详细信息。]。否则请求将被模式 /** 匹配,并且无法访问登录页面本身!这是一个常见的配置错误,会导致应用程序出现无限循环。如果您的登录页面看起来是安全的,Spring Security 将在日志中发出警告。也可以让所有匹配特定模式的请求完全绕过安全过滤器链,方法是为模式定义一个单独的 http 元素,如下所示:
<http pattern="/css/**" security="none"/>
<http pattern="/login.jsp*" security="none"/>
<http use-expressions="false">
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page='/login.jsp'/>
</http>
从 Spring Security 3.1 开始,现在可以使用多个 http 元素为不同的请求模式定义单独的安全过滤器链配置。如果从 http 元素中省略了模式属性,则它匹配所有请求。创建不安全模式是这种语法的一个简单示例,其中模式被映射到一个空的过滤器链 [4]。我们将在“安全过滤器链”一章中更详细地了解这种新语法。
重要的是要意识到这些不安全的请求将完全忽略任何与 Spring Security web 相关的配置或其他属性,例如 requires-channel,因此您将无法访问当前用户的信息或在请求期间调用安全方法。如果您仍希望应用安全过滤器链,请使用 access='IS_AUTHENTICATED_ANONYMOUSLY' 作为替代方案。
如果您想使用基本身份验证而不是表单登录,则将配置更改为
<http use-expressions="false">
<intercept-url pattern="/**" access="ROLE_USER" />
<http-basic />
</http>
然后,基本身份验证将优先,并在用户尝试访问受保护的资源时用于提示登录。如果您希望使用表单登录,则在此配置中仍然可用,例如通过嵌入在另一个网页中的登录表单。
设置默认登录后目标
如果尝试访问受保护资源时未提示表单登录,则default-target-url选项将发挥作用。这是用户成功登录后将转到的 URL,默认为“/”。您还可以通过将 always-use-default-target 属性设置为“true”来进行配置,以便用户始终在此页面结束(无论登录是“按需”还是他们明确选择登录) . 如果您的应用程序始终要求用户从“主页”页面开始,这将非常有用,例如:
<http pattern="/login.htm*" security="none"/>
<http use-expressions="false">
<intercept-url pattern='/**' access='ROLE_USER' />
<form-login login-page='/login.htm' default-target-url='/home.htm'
always-use-default-target='true' />
</http>
为了更好地控制目标,您可以使用 authentication-success-handler-ref 属性作为default-target-url的替代方法。引用的 bean 应该是 AuthenticationSuccessHandler 的一个实例。您将在核心过滤器一章和命名空间附录中找到更多相关信息,以及有关在身份验证失败时如何自定义流程的信息。
推荐阅读
- flutter - 如何为 SnackBar 使用 Fade Scale 动画包?
- javascript - 转换后文件损坏
- java - 尝试使用字符串和对象数组作为输入参数创建方法时出现 Javassist.CannotCompileException
- node.js - 未知的顶级运营商:$geoNear
- javascript - JS - 在头部更快地加载脚本
- python - DRF ,将检索功能路由到发布功能
- javascript - Javascript 使事件点击和语音识别与多个按钮一起工作
- python - 在模板内加载标签时出现 Django 404 错误
- julia - 没有返回的中断函数
- javascript - 如何过滤来自多个状态的数据从反应原生的不同API中获取数据