Spring Security认证与授权全解析

permissions = loginUser.getPermissions();

    return permissions.contains(permission);
}

}

```csharp
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
    private IUserService sysUserService;
@GetMapping("/living")
    @PreAuthorize("@auth.hasPermission('living')")
    public Result living() {
        return Result.success("可以开房");
    }
@GetMapping("/upgrade")
    @PreAuthorize("@auth.hasPermission('upgrade')")
    public Result upgrade() {
        return Result.success("可以升级房型");
    }
@GetMapping("/freeBreakfast")
    @PreAuthorize("@auth.hasPermission('freeBreakfast')")
    public Result freeBreakfast() {
        return Result.success("有免费早餐");
    }
@PostMapping("/login")
    public Result login(@RequestBody LoginRequest request) {
        return sysUserService.login(request);
    }
}

异常处理方法

  • 在遇到认证失败和授权失败时,我们希望可以放回与接口相同的json结构,这样可以让前端进行统一处理
  • 如果认证过程中出现异常会被封装成AuthenticationException如何调用AuthenticationEntryPoint对象的方法去进行异常处理

”`csharp

@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {

response.setContentType(“application/json;charset=utf-8”);

        response.getWriter().write(
                JSON.toJSONString(Result.fail(401, "用户身份认证不通过"))
        );
    }
}
```
  • 如果授权过程中出现的异常就会被封装AccessDeniedException然后调用AuthenticationEntryPoint对象的方法进行异常处理

”`csharp

@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {

response.setContentType(“application/json;charset=utf-8”);

        response.getWriter().write(
                JSON.toJSONString(Result.fail(401, "用户身份认证不通过"))
        );
    }
}
```

在SecurityConfig中进行配置

  • 注入处理器

”`csharp

    @Resource
    private AccessDeniedHandlerImpl accessDeniedHandler;

@Resource

    private AuthenticationEntryPointImpl authenticationEntryPoint;
```
  • 在使用http进行配置

”`csharp

        // 配置异常处理器
        http
                .exceptionHandling()
                .accessDeniedHandler(accessDeniedHandler)
                .authenticationEntryPoint(authenticationEntryPoint);
```