6

我在我的应用程序 Spring 控制器中实现了 Spring Security Expression:

@Controller
@RequestMapping("init")
public class InitController {
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public @ResponseBody String home(){
        return "This is the init page";
    }
}

使用此安全配置:

<http auto-config="true" create-session="stateless" use-expressions="true">
    <intercept-url pattern="/_ah*" access="permitAll" />
    <intercept-url pattern="/init/*" access="hasRole('ROLE_ADMIN')"/>
    <intercept-url pattern="/init*" access="hasRole('ROLE_ADMIN')"/>
</http>

访问此资源时,会显示默认的 Spring 登录表单http://localhost:8888/spring_security_login(适合这种情况。

对此有什么可能的解决方案?

  • 将 x-authorization-key 放在请求中是否很好
  • 如果是这样,它如何与 Spring 安全机制相匹配,即它如何与“hasRole”表达式相匹配
  • 我的网络服务是无状态的,并且每个请求都经过身份验证,这一点很重要
  • 最后,如何在不处理Spring登录表单的情况下处理Spring安全

标题

4

1 回答 1

8

您可能应该阅读有关做什么的说明然后auto-config将其删除以禁用form-login。如果您专门配置要使用的内容,您的配置会更清晰。

从您的问题中不清楚您希望在x-authorization-key标题中包含什么。如果您只是使用客户端 ID 和共享密钥进行身份验证,那么您不妨使用基本身份验证,因为它已经支持开箱即用,您可以添加<http-basic />到您的配置中。如果您有更多自定义的想法,那么您可能必须实现自定义过滤器并将其添加到 Spring Security 过滤器链中以提取凭据并处理它们。

您的身份验证机制如何适合也取决于它实际包含的内容。通常,您的用户将分配角色,这些角色在他们进行身份验证时加载,通常来自某种数据库。该hasRole表达式只是检查当前用户是否具有指定的角色。通常您只需要创建一个UserDetailsService以易于插入框架的标准格式加载您的用户信息的方法。这在别处有详细介绍。如果您真的需要更多定制的东西,这篇关于 GAE 集成的博客文章将详细介绍如何与更复杂的系统进行集成。

如果您使用Spring Security 将不会创建或使用会话create-session='stateless'

PS 您实际上并不需要在 URL 级别和处理相同 URL 的控制器上包含相同的安全属性。

于 2012-08-16T12:23:34.613 回答