【SpringSecurity】SpringSecurity2.7.x 的使用(02)

5. 获取认证后用户的信息

获取登录后用户的信息: SpringSecurity默认会把认证成功的用户信息保存到SrcurityContext,类似于session会话。 我们要想获取认证用户信息,可以在SrcurityContext该类拿到。

@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * 认证成功后,SpringSecurity会把用户的信息封装到Authentication该类中,
     * 并且该类存放在SecurityContext对象中---等价于session
     * @return Authentication
     */
    @GetMapping("/info")
    public Authentication authentication() {
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        //通过Authentication通常可以拿到Principal,里面存放着用户信息
        //Object principal = authentication.getPrincipal();
        //System.out.println(principal);
        return authentication;
    }
}

在这里插入图片描述

用户赋予权限之后,就不会显示角色信息。
在这里插入图片描述

6. 设置登录成功和失败的路径

如果未指定登录成功的路径,则默认跳转到 / 路径。如果未指定登录失败的路径,则默认跳转到登录页面(后面会多个?error参数)
在这里插入图片描述

  1. 注意不能直接跳转到静态资源路径,要先跳到controller中转一下
  2. 不常用的用法,现在讲究前后端分离,一般是无论登录成功与否只往前端发送json数据,而不再是跳转到某个页面。

7. 设置登录成功和登录失败时返回json数据

  //认证
  http
          .formLogin()
          //默认登录页面
          .loginPage("/login.html")
          //登录的处理路径,无需自己创建该路径的业务处理功能。
          .loginProcessingUrl("/login")
          //登录成功返回json
          .successHandler((request, response, authentication) -> {
              response.setContentType("application/json;charset=utf-8");
              PrintWriter writer = response.getWriter();
              Map<String, Object> map = new HashMap<>();
              map.put("code", 200);
              map.put("msg", "登录成功");
              map.put("data", "哈哈哈哈哈");
              String jsonStr = JSONUtil.toJsonStr(map);
              writer.println(jsonStr);
          })
          //登录失败返回json
          .failureHandler((request, response, authentication) -> {
              response.setContentType("application/json;charset=utf-8");
              PrintWriter writer = response.getWriter();
              Map<String, Object> map = new HashMap<>();
              map.put("code", 500);
              map.put("msg", "登录失败");
              map.put("data", "呵呵呵呵呵");
              String jsonStr = JSONUtil.toJsonStr(map);
              writer.println(jsonStr);
          })
          //放行
          .permitAll();

以上是关于SpringSecurity的认证

二、SpringSecurity授权

1. 配置文件中授权

认证成功后,当前用户具有哪个权限才可以访问对应的资源。

admin---->user:query, user:delete, user:insert,user:update

user------>user:query , user:export

  1. 创建资源类—控制层类。
@GetMapping("/user/query")
@ResponseBody
public String query(){
    return "user::query";
}

@GetMapping("/user/delete")
@ResponseBody
public String delete(){
    return "user::delete";
}

@GetMapping("/user/update")
@ResponseBody
public String update(){
    return "user::update";
}

@GetMapping("/user/insert")
@ResponseBody
public String insert(){
    return "user::insert";
}

@GetMapping("/user/export")
@ResponseBody
public String export(){
    return "user::query";
}
  1. 修改security配置
    在这里插入图片描述

默认登录成功后访问相应的资源,如果有该权限,则返回对应资源返回的结果,如果没有权限返回一个403错误页面。
在这里插入图片描述

非常不友好,前后分离,应该返回一个json数据。

//权限不足时返回json数据
http.exceptionHandling().accessDeniedHandler((request, response, accessDeniedException) -> {
    response.setContentType("application/json;charset=utf-8");
    PrintWriter writer = response.getWriter();
    Map<String, Object> map = new HashMap<>();
    map.put("code", 403);
    map.put("msg", "您没有权限访问");
    map.put("data", "呵呵呵呵呵");
    String jsonStr = JSONUtil.toJsonStr(map);
    writer.println(jsonStr);
});

2. 方法级别的授权

配置文件中授权,我们需要一一对资源和权限进行绑定,如果后期资源非常多,那么这里的代码就比较麻烦。 我们可以使用在方法上添加注解完成相应的绑定。

  1. 把原来的代码注掉
    在这里插入图片描述
  2. 开启注解驱动

在配置文件中添加注解驱动
在这里插入图片描述

  1. 使用注解在相应资源上
    在这里插入图片描述

通过权限授权

  • hasAuthority :有这个权限可以访问,只能写一个权限
  • hasAnyAuthority :为如果有其中的任意一个权限,就可以访问,里面可以写多个权限,例如:@PreAuthorize("hasAnyAuthority('user:query','user:delete')")

通过角色授权

  • hasAnyRole :有里面任意一个角色,就可以访问
  • hasRole :有这个角色就可以访问
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打乒乓球只会抽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值