【问题标题】:How to secure URLs using Spring security?如何使用 Spring 安全性保护 URL?
【发布时间】:2014-05-16 17:10:24
【问题描述】:

我正在使用 Spring MVC + Spring Security 开发一个 Web 应用程序,并且我有以下 URL:

/*this URL should be accessible by any User, i.e. users should be able to see other users' profiles*/
/users/someUserId/profile

/* all the following URLs should be accessed only by the current authenticated user */
/users/someUserId/profile/edit
/users/someUserId/picture/edit
/users/someUserId/notifications
/users/someUserId/friends

而且我需要按照前面的描述保护它们。

我的配置方法如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
                .antMatchers("/resources/**").permitAll()
                .regexMatchers("/users/[\\w]+/profile").authenticated()
                .antMatchers("/users/[\\w]/**").access("principal.name == regexGroupMatch")
                .anyRequest().authenticated()               
            .and()
                .jee().mappableRoles("Admin", "User");
    }

我想知道是否有可能实现这样的目标:

.antMatchers("/heroes/[\\w]/**").access("principal.name == regexGroupMatch")

通过这样做,我只希望用户 user1 能够访问这些 URL:

/users/user1/profile/edit
/users/user1/picture/edit
/users/user1/notifications

因此,user2 一定不能访问前面提到的 URL,但必须能够访问: /users/user1/profile/编辑 /users/user1/图片/编辑 /users/user1/notifications

还有:

/users/user1/profile
/users/user2/profile
/users/user3/profile
etc...

是否可以使用 Spring Security 来实现?

【问题讨论】:

  • 你读过文档吗?
  • 是的@chrylis,我已阅读文档here。我相信我可以使用.antMatcher(url) 来实现这一点,但我不知道我应该如何使用哪种方法才能只允许当前用户看到他自己的个人资料。
  • 顺便说一句,你读过this topic吗?

标签: java spring url spring-mvc spring-security


【解决方案1】:

不,没有在正则表达式中提取匹配组并将它们与用户名进行比较的功能。另外请注意,蚂蚁模式根本不支持正则表达式。

在任何情况下,依赖复杂的 URL 模式都不是一个好主意。对于这样的事情,您最好在控制器级别或某些服务接口上使用方法安全性,您可以在其中按名称引用方法参数。例如,启用方法安全表达式后,您可以编写

@PreAuthorize("#user.name == authentication.name")
public void editUser(User user) {
  ....
}

或者,正如 Misha 所说,您可以直接对规则进行编码,如果事情变得比简单的表达式更复杂,这会更好。

【讨论】:

  • 好吧,我已经更改了我的 URL 模式以简化它。正如您所建议的,保护服务层也是一个好主意。
【解决方案2】:

Spring Security 将确保访问这些端点的客户端经过身份验证,但您需要确保端点仅返回允许用户查看的数据。想想看——Spring Security 怎么知道你的应用程序中的哪些数据允许每个用户看到?

您可能已经有一个如下所示的控制器方法:

@RequestMapping(value = "/users/{user}/profile/edit", method = RequestMethod.GET)
public ModelAndView edit(
    HttpServletRequest request, 
    @PathVariable("user") String,
    EditRequest edit) {

    // Accept or reject the request if the user variable and authenticated
    // user match up as required.
}

在这里,您需要以编程方式区分经过身份验证的用户(可从请求对象中检索)和上下文所声明的用户。如果上下文中的用户是经过身份验证的用户,您可能会接受该请求,因为用户可能被允许修改他们自己的配置文件。否则,您可以抛出某种授权异常 - 或者更好的是,返回一个很好的视图来解释为什么该页面无法访问。

请注意,这也可以重写为过滤器,因为您没有使用请求正文中的任何信息。该过滤器确实会插入 Spring Security。

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2014-03-31
    • 2020-07-07
    相关资源
    最近更新 更多