Java Spring boot返回403,尽管我有管理权限
我在将Java Spring boot返回403,尽管我有管理权限,java,spring,redirect,spring-security,jwt,Java,Spring,Redirect,Spring Security,Jwt,我在将/admin端点添加到antMatchers(“/admin”)时遇到了这个问题。hasAuthority(“admin”) 它不会向/admin发出GET请求并返回200而是返回403 注意:我使用JWT作为额外的身份验证层 这是我的安全配置 httpSecurity.csrf().disable() .authorizeRequests().antMatchers(“/”、“/health”、“/authority”、“/dashboard”、“/users/login”、“/logo
/admin
端点添加到antMatchers(“/admin”)时遇到了这个问题。hasAuthority(“admin”)
它不会向/admin
发出GET请求并返回200
而是返回403
注意:我使用JWT作为额外的身份验证层
这是我的安全配置
httpSecurity.csrf().disable()
.authorizeRequests().antMatchers(“/”、“/health”、“/authority”、“/dashboard”、“/users/login”、“/logoutUser”、“/manageEvents”、“/ManageEds”、“/manageReports”,
“/charts”、“/error”、“/profile”、“/authenticate/**”、“/login”、“/403”、“/userProfile”、“/deletead”、“/users/add”)。permitAll()
.antMatchers(“/admin”).hasAuthority(“admin”)
.antMatchers(“/css/**”,“/img/**”,“/js/**”,“/images/**”,“/error_css/**”,“/scss/**”,“/vendor/**”)。permitAll()
.anyRequest().authenticated()和()。
exceptionHandling().accessDeniedPage(“/403”)。和()
.会议管理()
.sessionCreationPolicy(sessionCreationPolicy.STATELESS);
httpSecurity.addFilterBefore(jwtRequestFilter,UsernamePasswordAuthenticationFilter.class);
通过将其移动到permit.All()
它将起作用,但这里的情况并非如此
这就是我在@Controller
@GetMapping(“/authority”)
公共字符串getAuth(HttpServletResponse){
如果(jwt==null){
返回“重定向:/login”;
}
if(jwtTokenUtil.isTokenExpired(jwt)){
返回“重定向:/login?令牌=过期”;
}
addHeader(“Auth”、“Bearer”+jwt);
System.out.println(loggedinUser.getRoles());
if(loggedinUser!=null){
if(loggedinUser.getRoles().equalsIgnoreCase(“TileFinitis”)){
返回“重定向:/dashboard”;//将重定向
}else if(loggedinUser.getRoles().equalsIgnoreCase(“ADMIN”)){
System.out.println(“管理”);
返回“重定向:/admin”;//不会重定向
}else if(loggedinUser.getRoles().equalsIgnoreCase(“来宾”)){
返回“重定向:/403”;//将重定向
}否则{
返回“重定向:/dashboard”;//将重定向
}
}否则{
返回“重定向:/login”;
}
}
这是我的/admin
在@Controller
中,它从未被调用过
@GetMapping(“/admin”)
公共字符串getAdmin(HttpServletResponse){
如果(jwt==null){
返回“重定向:/login”;
}
if(jwtTokenUtil.isTokenExpired(jwt)){
返回“重定向:/login?令牌=过期”;
}
addHeader(“Auth”、“Bearer”+jwt);
System.out.println(“jwt”+jwt);
返回“admin”;
}
奇怪的是,有了邮差我就被重定向了
我错过了什么
编辑:第一个调用是在
/authenticate/web
上,我告诉spring我已通过身份验证
authenticationManager
.authenticate(新用户名密码AuthenticationToken(auth.getUsername(),auth.getPassword());
编辑2: 为了让事情更清楚: 从网站访问,流量:
/authenticate/web
.js
重定向到/authority
(获取)/admin
(GET)->403/authenticate/web
JWT
并将其包含在标题中,然后访问/authority
jwt
和response.addHeader
更新:
- 以下是来自邮递员的响应标题:
JWT
- 来自web的响应头
admin
页面是403
更新2: 我已经设法解决了一些问题, 首先
- 通过在我的security上设置一个
配置意味着spring将查找httpSecurity.addFilterBefore
,并在指定过滤器类的位置之前添加一个过滤器JWT
- 权限已正确分配给用户,因此没有问题 那里
- 我将
更改为hasAuthority()
hasRole()
Authentication auth=SecurityContextHolder.getContext().getAuthentication();
System.out.println(“主体:+auth.getPrincipal());
System.out.println(“Authorities:+auth.getAuthorities());
因为身份验证
被jwt过滤器覆盖
意味着只有在请求标头
包含有效的jwt
这就是为什么它是从postman
而不是从web
工作的
另一个问题是,在我的控制器中,我试图将jwt
添加到response
头上,该头只有在控制器完成其工作时才会添加到它,我无法进入下一行用户主体,因为它的请求头中没有jwt
此屏幕截图表示一个web呼叫和来自邮递员的呼叫,两者都访问/authority
端点
- 从邮递员那里,你可以看到
ADMIN
是一个权威
- 但是从网络上我有一个匿名的
角色
所以我有两个选择来解决这个问题:
将其添加到请求头中
使用JWT
保护REST
端点,并对web部件使用默认的spring安全性(hasRole()
etc)
而不是“/admin”
.antMatchers("/admin").hasAuthority("ADMIN")