在传统JSP web应用中,如果用shiro处理授权的话,通常通过FormAuthenticationFilter来直接截取用户提交的表单,并从中取出username、password、rememberMe三个参数来进行登录验证(截取的参数名可以在配置文件中手动修改)。
但是这并不适用于RESTful风格的应用,因为前端的用户验证信息是通过一个http的请求头请求发送过来的,没办法通过FormAuthenticationFilter进行处理,所以我们需要实现自己的filter。
无状态Filter的实现
此处为了正常处理登录验证和授权的功能,我们需要继承类HttpMethodPermissionFilter并实现两个方法
isAccessAllowed方法实现
此方法是整个授权认证的入口,负责从请求中获取用户信息并提交给SecurityManager进行授权认证,并在认证成功后将结果添加到request域。
需要注意的是为了在验证没通过时给前端返回对应错误信息,而控制器又没有直接调用认证的方法,所以需要此处捕获到异常并放入request域来方便controller进行处理。在使用FormAuthenticationFilter的案例中前者帮我们处理了这步骤。
处理登录请求的控制器实现
这里的ErrorResponseEntity是自行根据需要封装的错误实体类,其中最后是调用了org.springframework.http的ResponseEntity.status().body();来对Response的信息进行了封装。
本文实现方法修改参考自ichenkaihua
具体用户身份和认证令牌的封装请参考以上项目