【发布时间】:2020-04-11 00:28:28
【问题描述】:
我的 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 调试安全对象:FilterInvocation:URL:/dashboard;属性:hasAnyRole('ROLE_ADMIN') 2019-12-18T12:00:34.059+0000 DEBUG 先前已验证:org.springframework.security.authentication.UsernamePasswordAuthenticationToken@62aad9e7:主体:userdetails.CustomUserDetails@2228ff0d;凭证:[受保护];已认证:真实;详细信息: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 调试投票者:org.springframework.security.web.access.expression.WebExpressionVoter@6925373,返回:-1 2019-12-18T12:00:34.062+0000 DEBUG 访问被拒绝(用户不是匿名的);委托给 AccessDeniedHandler org.springframework.security.access.AccessDeniedException:访问被拒绝
抱歉,这里的“代码”标签中似乎无法显示异常:(
现在的问题是当我使用 ADMIN 登录时,所有工作都 100% 正常。但是当我使用 USER 或 DATA 登录时,我得到一个异常,说我试图访问和未经授权的页面。
所以发生的情况是它加载了用户 DATA 的 URL 访问权限,但是当最后一行执行时,它会将 /dashboard URL 更改为具有 ADMIN 访问权限。我的角色仍然是 DATA 角色,因此无权访问 /dashboard URL。
所以最后一行似乎覆盖了其他行。再次查看 URL 权限,如果我删除“/dashboard”,那么当涉及到“/data” URL 时,我会遇到同样的问题。
有没有更好的方法或者我可以解决这个问题?
谢谢
【问题讨论】:
标签: java spring spring-security user-roles