使用@RequestMapping,請求可以通過頭或請求參數與不同的控制器功能相關聯。有沒有辦法在用戶角色上實現這個基礎?如果在控制器中陳述,則目標是避免的。Spring Security:按用戶角色分離控制器
回答
據我所知,沒有任何東西出來,但如果你想要,你可以創建一個自定義映射註釋來爲你做這個路由。
我還沒有真正嘗試過此代碼的任何事,但這樣的:
你的新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
謝謝,這正是我正在尋找的。 – ltfishie 2014-12-02 18:22:25
執行AuthenticationSuccessHandler onAuthenticationSuccess根據用戶角色重定向到特定的控制器。
謝謝,雖然這將適用於一個URL登錄後,我我正在尋找一個可以應用於任何控制器的常規解決方案,如@RequestMapping(params =「a = b」) – ltfishie 2014-12-02 17:24:24
- 1. Spring Boot + Spring Security +分層角色
- 2. 定義Spring Security的用戶角色
- 3. Spring Security - 檢索用戶的角色
- 4. 在Spring Security中實現分層角色
- 5. Spring Security 4 ACL爲用戶和角色分配權限
- 6. Spring Security訪問角色
- 7. 如何保護用戶角色的Spring控制器方法?
- 8. 分離角路由,控制器,服務
- 9. 如何使用Spring Security在控制器中創建新用戶?
- 10. Grails和Spring Security:如何將用戶引入控制器?
- 11. 如何使用grails spring security在bootstrap中將角色分配給新用戶?
- 12. 如何在spring security和java註銷後獲取用戶角色?
- 13. Grails&Spring Security - 基於附加屬性專門化用戶角色
- 14. 如何通過Spring Security獲取當前用戶的角色
- 15. Grails在數據庫中沒有用戶/角色的spring-security-ldap
- 16. Grails的Spring Security的UI,用戶和角色管理訪問
- 17. Spring Security @Secured註解和Scala控制器
- 18. Spring Security用戶
- 19. Spring Security Taglibs控制語句
- 20. Spring Security中的多個角色
- 21. Spring Security只有一個角色?
- 22. 不同角色的Spring Security defaultsuccessurl?
- 23. Spring Security LDAP從LDAP加載角色
- 24. Spring Security角色層次結構@Secured JavaConfig
- 25. Java Spring Security無法識別的角色
- 26. Grails spring-security UserRole - 角色提取:'join'
- 27. Spring Security在註冊時設置角色
- 28. Spring Security的403錯誤時,角色JAVA
- 29. Spring Security - 角色無法正常工作
- 30. Spring Security角色層次結構問題
看到接受的答案(加上其他各種建議)在這裏:http://stackoverflow.com/questions/17995744/spring-security-mvc-same-requestmapping-different-secured – 2014-12-02 18:04:23