2014-12-02 63 views
0

使用@RequestMapping,請求可以通過頭或請求參數與不同的控制器功能相關聯。有沒有辦法在用戶角色上實現這個基礎?如果在控制器中陳述,則目標是避免的。Spring Security:按用戶角色分離控制器

+0

看到接受的答案(加上其他各種建議)在這裏:http://stackoverflow.com/questions/17995744/spring-security-mvc-same-requestmapping-different-secured – 2014-12-02 18:04:23

回答

1

據我所知,沒有任何東西出來,但如果你想要,你可以創建一個自定義映射註釋來爲你做這個路由。

我還沒有真正嘗試過此代碼的任何事,但這樣的:

你的新annoation,使用像@UserRoleMapping("ROLE_ADMIN")

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface UserRoleMapping { 
    String[] value(); 
} 

接下來,你可以擴展標準的春天RequestMappingHandlerMapping類(這是該類處理@RequestMapping註釋的標準映射)。你只需要告訴映射處理程序也考慮到自定義條件:

public class UserRoleRequestCondition extends RequestMappingHandlerMapping { 
    @Override protected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType) { 
     UserRoleMapping typeAnnotation = AnnotationUtils.findAnnotation(handlerType, UserRoleMapping.class); 
     return (typeAnnotation != null) ? new UserRoleRequestCondition(typeAnnotation.value()) : null; 
    } 
} 

上面的代碼只檢查創建了新的註釋控制器上面,如果發現它返回一個新的條件類,構造用你在註解中設置的值(例如「ROLE_ADMIN」)。這個MappingHandler需要在你的Spring配置中進行設置(無論你當前正在設置RequestMappingHandlerMapping,只需將其替換爲其中一個)。

接下來,我們需要創建自定義的條件 - 這是怎麼回事請求被調用,以確定這傢伙如果請求控制器匹配:

public class UserRoleRequestCondition implements RequestCondition<UserRoleRequestCondition> { 
    private final Set<String> roles; 

    public UserRoleRequestCondition(String... roles) { 
     this(Arrays.asList(roles)); 
    } 

    public UserRoleRequestCondition(Collection<String> roles) { 
     this.roles = Collections.unmodifiableSet(new HashSet<String>(roles)); 
    } 

    @Override public UserRoleRequestCondition combine(UserRoleRequestCondition other) { 
     Set<String> allRoles = new LinkedHashSet<String>(this.roles); 
     allRoles.addAll(other.roles); 
     return new UserRoleRequestCondition(allRoles); 
    } 

    @Override public UserRoleRequestCondition getMatchingCondition(HttpServletRequest request) { 
     UserRoleRequestCondition condition = null; 
     for (String r : roles){ 
      if (request.isUserInRole(r)){ 
       condition = this; 
      } 
     } 
     return condition; 
    } 

    @Override public int compareTo(UserRoleRequestCondition other, HttpServletRequest request) { 
     return (other.roles - this.roles).size(); 
    } 
} 

在上面,方法getMatchingCondition就是我們匹配請求。 (道歉,如果我錯過了一些分號或返回關鍵字等 - 這是基於groovy,但希望如果你在Java中,你可以找出那些位去!)

道具馬雷克的更詳細的答案在更完整的基於子域的自定義路由的解決方案上,當我需要實現類似的功能時,我使用了子域。 How to implement @RequestMapping custom properties - 給出關於正在發生的事情,以及如何有方法級別的註解(本例中跳過這一點,只定義類級別的註解)

我也寫了一些筆記在這這裏更多的細節:http://automateddeveloper.blogspot.co.uk/2014/12/spring-mvc-custom-routing-conditions.html

+0

謝謝,這正是我正在尋找的。 – ltfishie 2014-12-02 18:22:25

0

執行AuthenticationSuccessHandler onAuthenticationSuccess根據用戶角色重定向到特定的控制器。

+0

謝謝,雖然這將適用於一個URL登錄後,我我正在尋找一個可以應用於任何控制器的常規解決方案,如@RequestMapping(params =「a = b」) – ltfishie 2014-12-02 17:24:24

相關問題