我有一个 Spring MVC 应用程序。 它使用自己的自定义登录页面。成功登录后,“LOGGED_IN_USER”对象将放置在 HTTPSession 中。
我只想允许经过身份验证的用户访问 URL。我知道我可以通过使用网络过滤器来实现这一点。但是,这部分我想使用 Spring Security 来完成(我的检查将保持不变 - 在 HTTPSession 中查找“LOGGED_IN_USER”对象,如果存在则表示您已登录)。
我的约束是我目前无法更改登录行为 - 还不会使用 Spring Security。
我可以使用 Spring Security 的哪个方面来单独实现这部分 - 检查请求是否经过身份验证(来自登录用户)?
原文由 Jasper 发布,翻译遵循 CC BY-SA 4.0 许可协议
至少有4种不同的方式:
弹簧安全 XML 配置
这是最简单的方法
每个 @Secured 注释
需要
<global-method-security secured-annotations="enabled" />
每个 @PreAuthorize 注释
需要
<global-method-security pre-post-annotations="enabled" />
程式化
自定义表达式
如果内置表达式不够用,可以扩展它们。例如,此处讨论了如何扩展方法注释的 SpEL 表达式:
但是对于拦截器
<security:intercept-url ... access="myCustomAuthenticatedExpression" />
可能有一种稍微不同的方法,不需要处理私有类问题。 – 我只为 Spring Security 3.0 做过,但我希望它也适用于 3.1。1.) 您需要创建一个从
WebSecurityExpressionRoot
扩展的新类(前缀 Web 是重要部分!)。2.) 您需要扩展
DefaultWebSecurityExpressionRootHandler
以获得提供自定义表达式根的处理程序3.) 然后你需要向选民注册你的处理程序
春季安全 3.1 更新
从 Spring Security 3.1 开始,实现自定义表达式要容易一些。不再需要子类
WebSecurityExpressionHandler
和覆盖createEvaluationContext
。而是一个子类AbstractSecurityExpressionHandler<FilterInvocation>
或其子类DefaultWebSecurityExpressionHandler
并覆盖SecurityExpressionOperations createSecurityExpressionRoot(final Authentication a, final FilterInvocation f)
。