Spring Security 3.1.3.RELEASE使用问题及代码片段咨询
聊聊Spring Security 3.1.3下你的接口配置问题
嘿,我看到你参考2013年的技术书用了Spring Security 3.1.3.RELEASE,还贴了两个Controller的代码片段,结合这个版本的特性,我整理了几个常见的坑和解决办法:
先把你的代码理清楚
AdminController
// AdminController @Controller @RequestMapping("/admin") public class AdminController { @RequestMapping(method=RequestMethod.POST, value="/movies") @ResponseBody public String createMovie(@RequestBody String movie) { System.out.println("Adding movie!! "+movie); return "created"; } }
LoginController
// LoginController @Controller @RequestMapping("") public class LoginController { // 你这里代码没贴全,不过这类Controller一般是处理登录页面跳转、登录请求提交这些逻辑对吧? }
几个需要注意的点和解决方案
1. POST接口的CSRF坑
Spring Security 3.1.x默认是开着CSRF防护的,像你这个/admin/movies的POST接口,如果用Postman或者移动端这类非浏览器客户端调用,大概率会碰到403禁止访问的问题。
- 解决办法分两种:
- 如果你的服务是纯REST接口,不需要支持浏览器表单提交,直接在Spring Security配置里关掉CSRF就行:
<!-- 放在你的Spring Security XML配置文件里 --> <security:http> <!-- 其他配置项 --> <security:csrf disabled="true"/> </security:http> - 如果必须保留CSRF防护,那就要在请求头里带上
X-CSRF-Token,这个token可以从登录页面的隐藏域拿,或者专门写个接口返回给客户端。
- 如果你的服务是纯REST接口,不需要支持浏览器表单提交,直接在Spring Security配置里关掉CSRF就行:
2. 管理员接口的权限控制
/admin/**这种接口肯定得只让管理员访问对吧?你得在Spring Security里加权限规则:
<security:http> <!-- 配置只有拥有ROLE_ADMIN权限的用户才能访问/admin下的所有接口 --> <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN"/> <!-- 其他拦截规则,比如登录页面、公开接口之类的 --> <security:form-login login-page="/login" default-target-url="/"/> </security:http>
记得给你的管理员账号配上ROLE_ADMIN的权限哦。
3. @RequestBody接收参数的优化
你现在用String接收请求体,后续处理起来肯定麻烦,不如定义个Movie实体类来接收:
public class Movie { private String title; private String director; // 记得加getter和setter方法 }
然后把Controller方法改成这样:
@ResponseBody public String createMovie(@RequestBody Movie movie) { System.out.println("Adding movie!! "+movie.getTitle()); return "created"; }
Spring会自动帮你把JSON请求体解析成对象,方便多了。
4. 版本兼容性和安全问题
Spring Security 3.1.3确实有点年头了,存在不少已知的安全漏洞,如果不是必须兼容老系统,建议升级到更稳定的版本(比如4.x或者5.x),不过升级要注意和Spring框架版本的匹配:
- Spring Security 3.1.x对应Spring Framework 3.1.x
- 要升4.x的话,得用Spring Framework 4.0及以上版本
内容的提问来源于stack exchange,提问作者Eddy Freeman
相关产品推荐
相关产品推荐

