簡體   English   中英

使用用戶角色和 Spring Security 保護 URL

[英]Securing URL using User Roles and Spring Security

我的 Java 應用程序中有多個用戶角色。 這是我的代碼:

private String userAccess[] = new String[]{"/dashboard/**"};
private String dataAccess[] = new String[]{"/dashboard/**", "/data/**"};
private String adminAccess[] = new String[]{"/dashboard/**", "/data/**", "/admin/**"};

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
        .authorizeRequests()
        .antMatchers(publicResources).permitAll()
            .antMatchers(userAccess).hasRole("USER").anyRequest().authenticated()
            .antMatchers(dataAccess).hasRole("DATA").anyRequest().authenticated()
            .antMatchers(adminAccess).hasRole("ADMIN").anyRequest().authenticated()

錯誤:

2019-12-18T12:00:34.059+0000 DEBUG 安全對象:FilterInvocation:URL:/dashboard; 屬性:hasAnyRole('ROLE_ADMIN') 2019-12-18T12:00:34.059+0000 DEBUG 先前認證:org.springframework.security.authentication.UsernamePasswordAuthenticationToken@62aad9e7: Principal: userdetails@20d2UserDetails. 憑據:[受保護]; 已認證:真實; 詳細信息:org.springframework.security.web.authentication.WebAuthenticationDetails@b364:RemoteIpAddress:0:0:0:0:0:0:0:1; 會話 ID:空; 授予權限:ROLE_DATA 2019-12-18T12:00:34.059+0000 DEBUG 投票者:org.springframework.security.web.access.expression.WebExpressionVoter@6925373,返回:-1 2019-12-18T12.00000000000000000000000000000000000003訪問被拒絕(用戶不是匿名的); 委托給 AccessDeniedHandler org.springframework.security.access.AccessDeniedException:訪問被拒絕

抱歉,似乎無法在此處顯示“代碼”標簽中的異常:(

現在的問題是,當我使用 ADMIN 登錄時,所有工作 100%。 但是當我使用 USER 或 DATA 登錄時,我收到一個異常,說我試圖訪問和未經授權的頁面。

所以發生的事情是它加載了用戶 DATA 的 URL 訪問權限,但是當最后一行執行時,它更改 /dashboard URL 以具有 ADMIN 訪問權限。 我的角色仍然是 DATA 角色,因此無權訪問 /dashboard URL。

所以看起來最后一行正在覆蓋其他行。 再次查看 URL 權限,如果我刪除“/dashboard”,那么當涉及到“/data”URL 時,我會遇到同樣的問題。

有沒有更好的方法來做到這一點,或者我有辦法解決這個問題?

謝謝

如果不重復角色的端點怎么辦

private String userAccess[] = new String[]{"/dashboard/**"};
    private String dataAccess[] = new String[]{"/data/**"};
    private String adminAccess[] = new String[]{"/admin/**"};

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers(publicResources).permitAll()
                .antMatchers(userAccess).hasAnyRole("USER", "DATA", "ADMIN").anyRequest().authenticated()
                .antMatchers(dataAccess).hasAnyRole("DATA", "ADMIN").anyRequest().authenticated()
                .antMatchers(adminAccess).hasRole("ADMIN").anyRequest().authenticated();
    }

antMatchers 的順序很重要。

更具體的應該先行。 最不具體的應該放在最后。

將 antMatchers 重新排序如下:

.antMatchers(userAccess).hasRole("USER").anyRequest().authenticated()
            .antMatchers(dataAccess).hasRole("DATA").anyRequest().authenticated()
            .antMatchers(adminAccess).hasRole("ADMIN").anyRequest().authenticated()
            .antMatchers(publicResources).permitAll()

我假設用戶比數據更具體。

奇怪的授權......你需要改變邏輯。 在您的配置中寫着: publicResources permitAll AND matcher userAccess具有角色 USER AND 任何請求已通過身份驗證 AND matcher dataAccess具有角色 DATA AND 任何請求已通過身份驗證 AND ...(anyRequest 的多個定義)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM