在Spring SecurityContextHolder中存储有关来宾的信息

在Spring SecurityContextHolder中存储有关来宾的信息,spring,session,servlets,Spring,Session,Servlets,我想添加guests功能:这意味着guests是行为类似于用户的对象,但不是持久化的,并且具有ROLE\u GUEST而不是ROLE\u USER。我想在会话中存储guestID,这样当客人做某事时,我可以检索客人并以客人的名义执行操作。如果我想保留一个无状态Servlet,我将如何添加此信息 我当前的注册用户登录方式如下: auth = new UsernamePasswordAuthenticationToken(username, password, auths); Authenticat

我想添加guests功能:这意味着guests是行为类似于用户的对象,但不是持久化的,并且具有
ROLE\u GUEST
而不是
ROLE\u USER
。我想在会话中存储guestID,这样当客人做某事时,我可以检索客人并以客人的名义执行操作。如果我想保留一个
无状态Servlet
,我将如何添加此信息

我当前的注册用户登录方式如下:

auth = new UsernamePasswordAuthenticationToken(username, password, auths);
Authentication result = authManager.authenticate(auth);
SecurityContextHolder.getContext().setAuthentication(result);
我正在寻找类似的方法,或者直接在SecurityContextHolder.getContext()中的某个位置添加来宾名称。我可以获取spring
会话
对象或另一个会话来存储此信息吗


我没有使用
springmvc

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

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

....

这将导致
匿名身份验证筛选器
将带有提供的名称和角色的
匿名身份验证令牌
放入安全上下文中。(当然,只有当其他筛选器(如
UsernamePasswordAuthenticationFilter
无法对用户进行身份验证时,才会发生这种情况。)

在此配置中,来宾的名称是固定的,无法区分来宾。我正在寻找一种方法将唯一的来宾名称附加到他们身上。如何为未经身份验证的请求获取唯一名称?我有一个UserManager,它有一个来宾列表,将创建一个新名称,如下所示:String guestName=“guest”+random.Int();如果该guestname已在列表中,则尝试另一个guestname。超过24小时的访客名称将从列表中删除。我实际上在寻找一种将guestName附加到会话的方法,并检测会话何时中断以删除guestName。但我不知道如何…为什么不设置一个会话属性呢?当用户匿名浏览时,会话将持续,如果用户登录,会话将自动失效。如果您想获得有关会话生命周期事件的通知,您需要在web.xml中注册一个
HttpSessionListener
。您最后的评论正是我想要的答案,谢谢。About quote“当用户匿名浏览时,会话将持续,如果登录,会话将自动失效。”您的意思是当用户获得身份验证时,将创建一个新会话?