2012-11-28 75 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

謝謝,我已將驗證移至基於令牌的無狀態驗證 –

相關問題