2014-05-16 60 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中。