SpringSecurity基于注解的访问权限控制(四)

处理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 "所有用户可写操作";
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值