在传统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
具体用户身份和认证令牌的封装请参考以上项目