![](/img/trans.png)
[英]Show fields in jsp based on user roles(without using spring security)
[英]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.