Sco*_*ott 1 java aop spring spring-mvc spring-security
我已经使用Spring MVC一段时间了,现在为JSP页面添加了带注释的控制器.我有一个类似这样的类:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
public class AdminController {
@RequestMapping(value = "/doStuff1.htm", method = RequestMethod.POST)
public void doStuff1(@RequestParam("password")String password) {
// do some stuff
}
@RequestMapping(value = "/doStuff2.htm", method = RequestMethod.POST)
public void doStuff2(
@RequestParam("password")String password,
@RequestParam("foo")String foo{
// do some stuff
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,每个调用都会传入密码参数.密码从对话框中读取并传递到每个提交的调用中.
我想从方法调用中删除密码参数以获得"更干净"的代码.
我为此目的快速浏览了Spring安全性,但它似乎有点重量级.也许可以使用AOP?
有一个明显的解决方案我错过了吗?
非常感谢, - 斯科特
如您所见,每个调用都会传入密码参数.密码从对话框中读取并传递到每个提交的调用中.
a)这是一个糟糕的做法.这意味着任何拥有网络嗅探器的人都可以在任何地方看到您的密码.提交密码可能没问题(尽管使用安全的方式传输密码会更好),但会话应该包含身份验证令牌
b)仅限密码?没有用户名,切勿使用密码!使用暴力攻击时,任何独立密码最终都会被黑客入侵,但用户名/密码组合更难以破解.
c)您的控制器方法不应该知道或关心密码.这不是他们的顾虑.他们有工作要做,处理密码/安全是一个跨领域的问题,不应该在控制器级别实现.这引出了我们的问题:
AOP是实现跨领域功能的一种非常强大的方式,但它有一些缺点:
proxy-target-class="true"
(在XML配置中)时才能工作.后者有一些有趣的副作用,比如构造函数的双重执行.许多人使用它,但我会反对它.这意味着Spring AOP不是一个好选择.所以我的建议是:
Spring Security是一个自定义解决方案,可以完全满足您的需求:保护基于Spring的站点(使用Spring MVC或其他Web框架).虽然Spring Security可能是一个巨大的怪物,但在大多数情况下,所需的配置是最小的:
<http auto-config='true'>
<!-- restrict all URLs to role ROLE_USER -->
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<!-- define two users, jimi and bob -->
<user name="jimi" password="jimispassword"
authorities="ROLE_USER, ROLE_ADMIN" />
<user name="bob" password="bobspassword"
authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
(摘自A最小<http>
配置部分)
归档时间: |
|
查看次数: |
2035 次 |
最近记录: |