【问题标题】:Store information about guest in Spring SecurityContextHolder在 Spring SecurityContextHolder 中存储有关访客的信息
【发布时间】:2013-02-08 14:04:09
【问题描述】:

我想添加来宾功能:这意味着来宾是类似于用户的对象,但不是持久的,并且具有ROLE_GUEST 而不是ROLE_USER。我想在会话中存储一个guestID,这样当客人做某事时,我可以检索客人并以客人的名义采取行动。如果我想保留Stateless Servlet,我将如何添加此信息。

我当前的注册用户登录是这样的:

auth = new UsernamePasswordAuthenticationToken(username, password, auths);
Authentication result = authManager.authenticate(auth);
SecurityContextHolder.getContext().setAuthentication(result);

我正在寻找与此类似的东西,或者直接在 SecurityContextHolder.getContext() 中的某处添加来宾名称的方法。我可以获取 spring Session 对象或另一个会话来存储此信息吗?

我没有使用Spring MVC

【问题讨论】:

    标签: spring session servlets


    【解决方案1】:

    您应该使用框架提供的anonymous authentication mechanism 而不是假的UsernamePasswordAuthenticationToken。您可以使用安全命名空间对其进行配置:

    <security:http ....>
        ....
        <security:anonymous username="guest" granted-authority="ROLE_GUEST"/>
    </security:http>
    

    这将导致AnonymousAuthenticationFilter 将具有提供的名称和角色的AnonymousAuthenticationToken 放入安全上下文中。 (当然,只有在 UsernamePasswordAuthenticationFilter 等其他过滤器无法验证用户身份时才会发生这种情况。)

    【讨论】:

    • 在这个配置中guest的名字是固定的,没有办法区分guest。我正在寻找一种方法来为他们附加一个唯一的客人姓名。
    • 如何为未经身份验证的请求获取唯一名称?
    • 我有一个包含来宾列表的 UserManager,创建一个新名称如下: String guestName = "guest"+random.Int();如果客人名已经在列表中,则尝试另一个客人名。早于 24 小时的来宾名称将从列表中删除。我实际上正在寻找一种将guestName附加到会话的方法,并检测会话何时中断以删除guestName。但我不知道怎么...
    • 你为什么不设置一个会话属性?会话将在用户匿名浏览时持续,并在登录后自动失效。如果您想获得有关会话生命周期事件的通知,您需要在 web.xml 中注册HttpSessionListener
    • 您最后的评论几乎就是我正在寻找的答案,谢谢。关于报价“会话将在用户匿名浏览时持续,如果登录则自动失效。”您的意思是当用户通过身份验证时会创建一个新会话?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多