处理403权限不足页面
/**
* Created by Monologue_zsj on 2021/4/15 12:17
* Author:小脸儿红扑扑
* Description:403访问受限错误解决处理器
* 当访问发生403错误的时候,SpringSecurity自动调用
* SpringSecurity想调用类中的方法,处理403错误,必须能在Spring容器中获取对象。
*/
@Component
public class MyAccessDeniedHandler implements AccessDeniedHandler {
/**
* 处理403错误的真实方法
* @param request 请求对象
* @param response 响应对象
* @param e 异常
* @throws IOException
* @throws ServletException
*/
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException {
//设置响应状态
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
//设置响应类型
response.setContentType("text/html;charset=UTF-8");
//响应输出
response
.getWriter()
.println("<html><body><div style='width=800px; text-align=center; margin: auto; font-size=24px'>权限不足,请联系管理员...</div></body></html>");
//刷新输出流的缓冲区
response.getWriter().flush();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
...
//配置403访问错误处理器
http.exceptionHandling().accessDeniedHandler(myAccessDeniedHandler);
//关闭CSRF安全协议,关闭是为了完整流程的可用
http.csrf().disable();
}
@Autowired
private MyAccessDeniedHandler myAccessDeniedHandler;
基于注解的访问权限控制
/**
* Created by Monologue_zsj on 2021/4/14 13:54
* Author:小脸儿红扑扑
* Description:SpringSecurity默认环境中,拦截所有请求,要求必须认证(登录)后才能访问。
* 默认环境中,用户名是user,每次启动的时候,动态生成一个长度128字节的密码。在控制台输出。
* 默认环境中,提供登录页面的请求地址是/login, 请求方式是GET
* 默认环境中,处理登录请求的地址是/login, 请求方式是POST
*
* @EnableGlobalMethodSecurity - 开启SpringSecurity注解扫描的
* 默认扫描当前类所在包及所有子孙包中的Security注解
* 在部分的版本中,只要声明注解,所有的属性自动赋值为true
* 大多数版本中,注解的属性值默认值都是false
*/
@SpringBootApplication(scanBasePackages = {"com.monologue.security.*"})
@MapperScan("com.monologue.security.mapper")
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) //开启SpringSecurity注解扫描的
public class FirstSecurity {
public static void main(String[] args) {
SpringApplication.run(FirstSecurity.class, args);
}
}
/**
* Created by Monologue_zsj on 2021/4/14 19:54
* Author:小脸儿红扑扑
* Description:
*/
@Controller
public class AccountController {
@GetMapping("/toLogin")
public String toLogin() {
return "/login";
}
@GetMapping("/toMain")
public String toMain() {
return "/main";
}
@GetMapping("/failure")
public String failure() {
return "/failure";
}
/**
* antMatchers("/admin/read").hasRole("管理员");
* 只能是管理员角色访问
* @Secured :校验登录用户是否有需要的角色
* 属性value:String[] 类型,相当于hasAnyRole
* 注解不能自动拼接角色前缀
* @return
*/
@Secured("ROLE_管理员")
@GetMapping("/admin/read")
@ResponseBody
public String adminRead() {
return "管理员读取";
}
/**
* antMatchers("/guest/read").hasRole("访客");
* 只能是访客角色访问
* @return
*/
@Secured("ROLE_访客")
@GetMapping("/guest/read")
@ResponseBody
public String guestRead() {
return "访客读取";
}
/**
* antMatchers("/all/read").hasAnyRole("访客", "管理员");
* 必须有访客或管理员角色访问
* @return
*/
@Secured({"ROLE_管理员", "ROLE_访客"})
@GetMapping("/all/read")
@ResponseBody
public String allRead() {
return "任意用户读取";
}
/**
* 必须拥有权限admin:write的登录用户,才可以访问
* 只能是管理员角色访问
* PreAuthorize - 方法执行前,校验权限是否满足,方法相当于access
* 属性value - 字符串 提供access方法动态表达式,如hasRole("ROLE_xxx") hasAuthority("xxx")
* PostAuthorize - 方法执行结束后,校验权限是否满足
* @return
*/
@PreAuthorize("hasAuthority('admin:write')")
@GetMapping("/admin/write")
@ResponseBody
public String adminWrite() {
return "管理员写操作";
}
/**
* 必须包含admin:write或guest:write权限的登录用户,才可以访问
* 只能是管理员角色访问
* @return
*/
@PreAuthorize("hasAnyAuthority('admin:write', 'guest:write')")
@GetMapping("/all/write")
@ResponseBody
public String adminAll() {
return "所有用户可写操作";
}
}