当前位置: 首页 > 面试题库 >

如何在spring获得会话对象?

曾阳飙
2023-03-14
问题内容

我对Spring和Spring安全性比较陌生。

我试图编写一个程序,需要使用Spring安全性在服务器端对用户进行身份验证,

我想出了以下几点:

public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken)
                    throws AuthenticationException
    {
        System.out.println("Method invoked : additionalAuthenticationChecks isAuthenticated ? :"+usernamePasswordAuthenticationToken.isAuthenticated());
    }

    @Override
    protected UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication) throws AuthenticationException 
    {
        System.out.println("Method invoked : retrieveUser");
        //so far so good, i can authenticate user here, and throw exception if not authenticated!!
        //THIS IS WHERE I WANT TO ACCESS SESSION OBJECT
    }
}

我的用例是,当对用户进行身份验证时,我需要放置以下属性:

session.setAttribute("userObject", myUserObject);

myUserObject是某个类的对象,我可以跨多个用户请求在整个服务器代码中对其进行访问。


问题答案:
// example usage
public static HttpSession session() {
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    return attr.getRequest().getSession(true); // true == allow create
}

这将由标准的spring mvc派发servlet填充,但是,如果你使用的是不同的Web框架,则需要org.springframework.web.filter.RequestContextFilter在你web.xml的管理器中添加过滤器。

编辑:作为附带问题,你实际上要做什么,我不确定你是否需要访问HttpSessionretieveUser方法UserDetailsService。Spring安全性将以任何方式将UserDetails对象放入会话中。可以通过访问来检索它SecurityContextHolder

public static UserDetails currentUserDetails(){
    SecurityContext securityContext = SecurityContextHolder.getContext();
    Authentication authentication = securityContext.getAuthentication();
    if (authentication != null) {
        Object principal = authentication.getPrincipal();
        return principal instanceof UserDetails ? (UserDetails) principal : null;
    }
    return null;
}


 类似资料:
  • 问题内容: 我正在寻找一种获取自定义对话框大小的方法。我经历了这个问题,但是给出的唯一答案是毫无用处的,因为如果尝试,它只会返回-2,这是我设置为dialog的属性的常量。我如何获得它的大小。我想知道背景图片的样式。 问题答案: 实际上,在Android中它不像在iOS中那样工作-您无法获得自身的大小,但是,您可以做的就是要求该视图的 ROOT 布局的大小。 例如:

  • 有没有办法在Spring MVC中获取当前会话,但不是通过请求。通常,我们所做的是在操作/控制器类方法中获取请求。从这个请求中,我们逐个请求获得会话。getSession()。但是,有没有办法在没有此请求对象的情况下获取此会话? 我的动机是,在一个实用程序类中,我需要访问会话中设置的值,而这个实用程序类方法是从控制器类的50多个方法中访问的。如果我必须从请求中获得会话,那么我需要更改所有这50个位

  • 问题内容: 我有 如果正在使用entitymanager,如何检索会话?如何从分离标准中获取结果? 问题答案: 为了完全详尽无遗,如果您使用的是JPA 1.0或JPA 2.0实现,则情况有所不同。 JPA 1.0 对于JPA 1.0,您必须使用。但是请记住, 此方法的结果是特定 于 实现的, 即从使用Hibernate的应用程序服务器到其他服务器之间不可移植。例如,使用JBoss,您可以执行以下操

  • 我正在使用Spring Boot、Spring Security性和spring会话(redis)构建spring REST web应用程序。我正在使用SpringCloud和zuul代理按照网关模式构建一个云应用程序。在这个模式中,我使用spring会话来管理redis中的HttpSession,并使用它来授权我的资源服务器上的请求。当执行更改会话权限的操作时,我希望更新该对象,以便用户不必注销

  • 我正在尝试制作一个Minecraft客户端,但我不知道如何获取会话ID来启动游戏。我在google上搜索了一下,但无论如何都找不到从命令行启动Minecraft的答案——用户名和密码作为前缀不起作用。

  • 问题内容: 我正在开发一个具有基于Flex的前端和Spring / Hibernate后端的应用程序。 要使Facebook集成以目前的方式运行,我需要阅读后端前端javascript中设置的cookie,并在登录期间进行一些验证,以查看用户是否尝试欺骗其Facebook。登录。 这将非常容易,但是我不知道如何获取HttpServletRequest。我正在使用一个非常基本的Spring配置(这是