2012-11-28 36 views
3

我一直在寻找一种方法来通过REST控制器(URL params)对用户进行身份验证。 这样做的最接近的事是:通过REST在Spring MVC中进行身份验证

@Controller 
@RequestMapping(value="/api/user") 
public class UserController extends BaseJSONController{ 

    static Logger sLogger = Logger.getLogger(UserController.class); 

    @RequestMapping(value = "/login", method = RequestMethod.POST) 
    public @ResponseBody String login(@RequestParam(value="username") String user, @RequestParam(value="password") String pass) throws JSONException { 
     Authentication userAuth = new UsernamePasswordAuthenticationToken(user, pass); 
     MyCellebriteAuthenticationProvider MCAP = new MyCellebriteAuthenticationProvider(); 

     if (MCAP.authenticate(userAuth) == null){ 
      response.put("isOk", false); 
     } 
     else{ 
      SecurityContextHolder.getContext().setAuthentication(userAuth); 
      response.put("isOk", true); 
      response.put("token", "1234"); 
     } 
     return response.toString(); 
    } 

} 

但是,这不会产生一个cookie。 任何想法或更好的方法来实现我想实现的目标?

+0

如果您的目标是将会话信息保存为基于cookie的令牌,那么您可能正在寻找[Remember-Me Authentication](http://static.springsource.org/spring-security/site/)文档/ 3.0.x的/参照/记住-me.html)。 –

回答

3

首先,你不应该手动执行此操作:

SecurityContextHolder.getContext().setAuthentication(userAuth) 

最好是聘请负责验证特殊的过滤器,设置安全上下文和清除其请求被处理后。默认情况下,Spring Security使用线程本地来存储安全上下文,因此如果您在客户端调用后不删除它,另一个客户端可以自动作为其他人登录。请记住,服务器线程经常被不同客户端的不同请求重复使用。其次,我会建议使用基本或摘要身份验证为您的REST风格的Web服务。两者都受到Spring Security的支持。更多文档http://static.springsource.org/spring-security/site/docs/3.1.x/reference/basic.html

最后,请记住REST风格的Web服务应该是无状态的。

还要记住Spring Security文档是你的朋友。 :-)

+0

谢谢,我已将验证移至基于令牌的无状态验证 –

相关问题