2014-05-16 32 views
1

我正在开发使用Spring MVC + Spring Security的Web应用程序,和我有以下网址:如何使用Spring安全保护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("https://stackoverflow.com/users/[\\w]+/profile").authenticated() 
       .antMatchers("https://stackoverflow.com/users/[\\w]/**").access("principal.name == regexGroupMatch") 
       .anyRequest().authenticated()    
      .and() 
       .jee().mappableRoles("Admin", "User"); 
    } 

我想知道是否有可能实现这样的事情:

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

通过这样做,我愿意只有用户user1能够访问的网址:

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

所以,user2的必须不能访问前面提到的网址,但必须能够访问: /用户/用户1 /型材/编辑 /用户/用户1 /图片/编辑 /用户/用户1 /通知

除了:

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

是否有可能实现,使用Spring Security的?

+0

你是否阅读过文档? – chrylis

+0

是@chrylis,我已阅读文档[此处](http://docs.spring.io/spring-security/site/docs/3.2.3.RELEASE/reference/htmlsingle/)。我相信我可以使用'.antMatcher(url)'实现,但我不知道如何使用哪种方法才能让当前用户看到他自己的配置文件。 – fvdalcin

+2

顺便说一句,你读过[这个主题](http://meta.stackoverflow.com/questions/251758/why-is-stack-overflow-so-negative-of-late)? – fvdalcin

回答

2

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

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

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

另外,作为米沙说,你可以直接编码规则,如果事情变得比简单的表达更复杂的是优选。

+0

那么,我已经改变了我的URL模式,以便简化它。正如你所建议的那样,保护服务层也是一个好主意。 – fvdalcin

1

Spring Security将确保访问这些端点的客户端通过身份验证,但是由您来确保端点只返回允许用户查看的数据。想一想 - Spring Security如何知道每个用户可以看到应用程序中的数据?

您可能已经有一个控制器的方法,看起来像这样:

@RequestMapping(value = "https://stackoverflow.com/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中。