下面是关于SpringSecurity配置403权限访问页面的完整攻略。
- 配置SpringSecurity权限控制
在SpringSecurity的配置类中进行权限控制的配置。首先需要注入一个自定义的UserDetailsService对象:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.and().formLogin()
.and().csrf().disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
}
这个方法配置了两个URI的权限,将"/admin/"的访问权限配置为有角色"ADMIN"的用户才能访问,将"/user/"的访问权限配置为有角色"USER"的用户才能访问。
- 配置403页面
当访问被拒绝的页面时,需要显示403错误页面。在Spring MVC的配置类中定义对403页面的映射:
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/403").setViewName("error/403");
}
}
这段代码将URI "/403" 映射到了error/403.html模板文件。
- 编写403错误页面
在resources/templates/下创建error/403.html模板文件,添加以下内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>403 Forbidden</title>
</head>
<body>
<h1>403 Forbidden</h1>
<hr>
<p>Your access to this resource has been denied.</p>
</body>
</html>
编辑模板文件,使其显示符合您网站的样式和特色。
- 自定义403页
如果需要自定义403错误页面的内容,那么可以从SpringSecurity的AccessDeniedHandler中扩展出一个自己的实现。在实现中,您可以响应一个REST请求,返回一个JSON格式的错误信息;也可以返回一个完整的HTML页面。
例如,下面的代码中,自定义了一个处理403错误的Handler,并返回了一个HTML:
@Component
public class CustomAccessDeniedHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException, ServletException {
response.sendRedirect(request.getContextPath() + "/403");
}
}
在SpringSecurity的配置类WebSecurityConfig中,将CustomAccessDeniedHandler加入到配置中,如下:
@Autowired
private CustomAccessDeniedHandler accessDeniedHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.exceptionHandling().accessDeniedHandler(accessDeniedHandler);
// other configuration
}
另外一种实现 CustomAccessDeniedHandler 的方法是返回一个JSON错误信息:
@Component
public class CustomAccessDeniedHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException, ServletException {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
Map<String, Object> body = new HashMap<>();
body.put("timestamp", LocalDateTime.now());
body.put("status", HttpServletResponse.SC_FORBIDDEN);
body.put("message", "Access denied");
body.put("path", request.getRequestURI());
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getOutputStream(), body);
}
}
- 验证配置是否生效
最后,通过实现一个返回403错误的controller来验证配置是否生效:
@GetMapping("/forbidden")
public String forbidden() {
return "forbidden-page";
}
在本示例中,"forbidden-page"的访问是在被拒绝的。如果配置正确,当一个未经授权的用户尝试访问时,将看到一个403错误页,也可以通过CustomAccessDeniedHandler进行自定义。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于SpringSecurity配置403权限访问页面的完整代码 - Python技术站