簡體   English   中英

無法訪問Spring Security登錄的用戶信息

[英]Not able to access Spring Security Logged in User info

我正在使用Spring Security在Web應用程序中進行身份驗證。
現在,我需要訪問用戶信息,Controller中存在以下方法:

@RequestMapping(value = "/userstuff")
@Controller
public class SomeUserController {

    @RequestMapping(value = "getUser", method = RequestMethod.GET)
    @ResponseBody
    public UserDetails getUser(Locale locale, Model model) {
        UserDetails userDetails = null;
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        if (authentication != null) {
            Object principal = authentication.getPrincipal();
            userDetails = (UserDetails) (principal instanceof UserDetails ? principal
                    : null);
        }
        return userDetails;
    }

}

如果控制器URL不在applicationContext-Security.xml中像這樣進行安全檢查,則:

<security:http pattern="/userstuff/**" security="none" /> 

然后調用

http:// host:port / app / userstuff / getUser- 返回null

但是,如果確實將其注釋掉了(允許Spring Security對其進行攔截):

<!-- <security:http pattern="/userstuff/**" security="none" /> -->

然后調用:
http:// host:port / app / userstuff / getUser 返回正確登錄的用戶

為什么這樣?

當您使用security="none" 所有spring安全過濾器都將關閉 (請參閱官方文檔中的此項 )。 因此,沒有SecurityContextHolder ,沒有@PreAuthorize ,沒有其他Spring Security功能可用。 例如,通常, SecurityContextHolder由安全過濾器鏈中的一個過濾器填充。

作為解決方法,幾乎​​總是可以通過限制匿名用戶來替換security="none"構造:

<security:http ... />
    ...
    <security:intercept-url pattern="/userstuff/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    ....
</security:http>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM