2012-12-10 46 views
0

我在我的項目中使用spring security進行身份驗證,在成功身份驗證後,我獲取了存儲各種詳細信息的主體對象。 此主體對象被傳遞給各種方法,允許將條目反映到當前用戶的數據庫中。總之,校長幫助我在任何需要它的地方提供principal.getName()。如何整合春季安全與春季社交在兩種情況下都有相同的執行流程?

但現在當我通過彈簧社會請登錄我沒有在手校長主要對象,而不是我已經實現MyPrincipal類--->

public class MyPrincipal implements Principal { 
public String name; 
public boolean flag; 

public boolean isflag() { 
    return flag; 
} 

public void setFlag(boolean flag) { 
    this.flag = flag; 
} 

public void setName(String name) { 
    this.name = name; 
} 

@Override 
public String getName() { 
    return name; 
} 

} 

然後在社會登錄處理,我將當前用戶名和標誌值添加到myPrincipal對象,並將用戶轉發到彈出安全性在正常登錄情況下轉發的同一主頁。

MyPrincipal myPrincipal = new MyPrincipal(); 
        myPrincipal.name = username; 
        myPrincipal.socialFlag = true; 
        modelMap.addAttribute("myPrincipal", myPrincipal); 
        return new ModelAndView("forward:/home"); 

@SessionAttributes({"myPrincipal"}) 

現在從這裏添加在會話這個對象通過註釋類上病房我想交由流動到主頁的所有功能,致力於爲用戶正確。但是每一個方法正在校長校長作爲參數,就像這樣 - >

@RequestMapping(value = {"/home"}, method = RequestMethod.POST) 
@ResponseBody 
    public ModelAndView test(ModelMap modelMap, Principal principal) { 
    String name = principal.getName(); 
} 

有兩種不同的東西都四處情況下─ 正常登錄是給我的直接主體,而是社會的登錄是給我它會話屬性。

即使在普通的spring安全登錄的情況下,我也不想傳遞principal作爲參數,而是在這裏我也想把它放在session屬性中。 如何在執行自己的身份驗證提供程序時執行此操作以及在哪裏進行更改。

回答

1

我不認爲我完全理解......但是,總的來說,不應該有必要傳遞主要實例。使用org.springframework.security.core.context.SecurityContextHolder.getContext()來獲取上下文,然後調用SecurityContext.getAuthentication().getPrincipal()SecurityContext.getAuthentication().getDetails()