为Spring MVC Controller - AOP或Spring Security的方法传递密码?

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?

有一个明显的解决方案我错过了吗?

非常感谢, - 斯科特

Sea*_*oyd 6

如您所见,每个调用都会传入密码参数.密码从对话框中读取并传递到每个提交的调用中.

a)这是一个糟糕的做法.这意味着任何拥有网络嗅探器的人都可以在任何地方看到您的密码.提交密码可能没问题(尽管使用安全的方式传输密码会更好),但会话应该包含身份验证令牌

b)仅限密码?没有用户名,切勿使用密码!使用暴力攻击时,任何独立密码最终都会被黑客入侵,但用户名/密码组合更难以破解.

c)您的控制器方法不应该知道或关心密码.这不是他们的顾虑.他们有工作要做,处理密码/安全是一个跨领域的问题,不应该在控制器级别实现.这引出了我们的问题:

使用方法:AOP还是Spring Security?

AOP是实现跨领域功能的一种非常强大的方式,但它有一些缺点:

  • 如果您使用Spring AOP,建议控制器只有在您使用接口支持的代理(并且定义从未通过Java调用的代码的接口有点尴尬)或使用基于CGLib的子类proxy-target-class="true"(在XML配置中)时才能工作.后者有一些有趣的副作用,比如构造函数的双重执行.许多人使用它,但我会反对它.这意味着Spring AOP不是一个好选择.
  • 但是,如果您使用静态AspectJ编译,则会将您的安全问题硬连线到应用程序代码中.安全设置应该是可配置的,无需重新编译类,所以我说我们也没有去过这里.

所以我的建议是:

使用Spring Security

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>配置部分)