spring-security 返回空值的安全上下文保持器

7vhp5slm  于 2022-11-11  发布在  Spring
关注(0)|答案(5)|浏览(157)

我想使用以下代码手动绕过spring Security中的用户:

User localeUser = new User();
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(localeUser ,null, localeUser .getAuthorities());
SecurityContext securityContext = SecurityContextHolder.getContext();
        securityContext.setAuthentication(auth);
        // Create a new session and add the security context.
        HttpSession session = request.getSession(true);
        session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
return "dummyLogin";

虚拟登录页面(由图块处理)在内部调用同一控制器中的不同请求Map,我试图在该控制器中获得类似于以下内容的身份验证。

SecurityContextHolder.getContext().getAuthentication()

我在哪里得到空?

stszievb

stszievb1#

所以,我发现了真正的问题!问题是我在security-context.xml中用security=“none”标记了整个控制器。所以,当它从第一个链接跳到第二个链接时,它没有传递任何安全上下文!!很抱歉给你们带来麻烦,伙计们。

ltskdhd1

ltskdhd12#

您的localUser为空。因此auth变为空。因此没有身份验证对象被添加到安全上下文中。
请看一下文件
http://docs.spring.io/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/core/userdetails/User.html
最好具有自定义UserDetailsService

public class CustomUserDetailsService implements UserDetailsService 

//implement the method which return a UserDetails Object
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException

则可以使用

UserDetails userDetails= customUserDetailsService.loadUserByUsername("name"); 
Authentication authentication= new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()) ; 
SecurityContextHolder.getContext().setAuthentication(authentication);
w3nuxt5m

w3nuxt5m3#

**其他答案:**如果您要获取非安全URL的登录用户详细信息,则可以将其添加到安全URL,并指定为“permitAll”,如下所示:

<http>
    //...

    <intercept-url pattern="/your/url/**" access="permitAll"/>

    //...
</http>

然后,您将能够检查已登录的用户(如果已登录)或获取凭据。

uurv41yg

uurv41yg4#

我也面临着类似的问题。我的代码中的问题是,我的控制器的请求Map前缀在我的安全令牌配置文件中被忽略了,这导致SecurityContextHolder为空。

monwx1rj

monwx1rj5#

试试看:

Authentication authentication=SecurityContextHolder.getContext().getAuthentication();
localeUser .setUserNm(authentication.getName());

相关问题