2016-11-07 119 views
2

我正在研究網關後面的服務方法,以便輕鬆進行通信。Spring安全性全局預授權規則

該計劃在oauth令牌中使用該範圍,該範圍將由在同一系統上運行的服務使用。

例如。如果oauth令牌具有作用域'acct'和'user',則可以使用bellow api方法。在不更改註釋的情況下,我希望它也可用,前提是令牌具有「管理員」範圍,並且缺少其中一個或兩個範圍的「acct」和「user」。

@PreAuthorize("#oauth2.hasScope('acct') and #oauth2.hasScope('user')") 
@RequestMapping(value = "/scopedtest", produces = "application/json") 
public Map<String, String> indexWithScope() { 
    return getHashMapResult(); 
} 

我想這個「管理員」範圍被全球所接受,使服務開發人員不必包括每個API控制自己給管理員範圍,但仍允許內部服務訪問的其他內部服務的API 。

這將作爲攔截預授權的調用並將響應更改爲調用者被授權(如果具有「管理」範圍)的代碼。如果oauth標記具有從預授權標註中要求的作用域,則該調用將正常工作。

回答

1

這是通過向現有的決策選民列表中添加選舉人來解決的。

的第一步是創建一個自定義選民類

public class CustomVoter implements AccessDecisionVoter { 

    @Override 
    public boolean supports(ConfigAttribute attribute) { 
     return true; 
    } 

    @Override 
    public int vote(Authentication authentication, Object object, Collection collection) { 
     //Place your decision code here 
     if(check_is_true()) { 
      //grant access 
      return ACCESS_GRANTED; 
     } else if (check_is_false()) { 
      //deny access 
      return ACCESS_DENIED; 
     } else { 
      //do not make a choice 
      return ACCESS_ABSTAIN; 
     } 
    } 

    @Override 
    public boolean supports(Class clazz) { 
     return true; 
    } 
} 

我們現在需要這個選民添加到選民,這將使訪問決策的列表。

@Configuration 
public class DecisionVotersConfiguration { 

    @Autowired 
    MethodInterceptor methodSecurityInterceptor; 

    @PostConstruct 
    @DependsOn("methodSecurityInterceptor") 
    public void modifyAccessDecisionManager() { 
     ((AffirmativeBased)((MethodSecurityInterceptor)methodSecurityInterceptor).getAccessDecisionManager()).getDecisionVoters().add(0, new CustomVoter()); 
    } 
} 

這將添加您的自定義決定的選民決定的選民名單。通過將它放置在索引0處,它將首先被檢查。這將允許選民授予訪問權限,之後的檢查將拒絕訪問。此配置類中的方法將取決於正在創建的methodSecurityInterceptor,它將具有決策選擇器的初始列表。

0

使用WebSecurity

您當前正在控制器操作中使用preauthorize規則。方法安全的力量最初是,使用它的方法而不是直接相關的路由,因爲這些可以設置HttpSecurity請求匹配器,通常通過使用WebSecurityConfigurerAdapter

然而,這並不能真正幫助你,因爲spring有一條通往許可方法的途徑,而不是路由方法的許可。這意味着,如果您擁有一個全局角色,無論具體配置如何,都可以訪問所有內容,但如果要避免更改默認配置,則必須將其配置爲所有安全性定義。

我看到解決您的需求的唯一方法是掛鉤彈簧安全篩選過程併爲管理範圍定義特殊規則。您可以閱讀here有關如何實現自定義過濾器,其中放置後您的OAuth2驗證程序提取,尋找管理範圍(或不同的全球性規則)

樹角色

這是我使用的一些合理的解決方案我的項目,它給角色一些「父」角色,這意味着角色沿着樹中的當前節點。所以root會隱式授予您配置的所有角色/範圍。爲了簡單起見,我在寫入時應用這些樹邏輯,例如給[ROOT_ROLE]結果添加(樹遍歷)下的所有角色,或者撤消從節點向上根到深度優先搜索找到的所有角色。動機就在這裏,訪問控制策略通常反映了用戶的層次結構,並給出了更多的自由來使用樹來正確地設計這些個人層次結構。這種模式以可擴展的方式間接解決了您的問題