0

我正在使用 Spring Security 来处理我的 Spring MVC Web 应用程序的用户身份验证。我能够从 Authentication 对象中获取用户名,但我的用户名是电子邮件地址,我希望能够在我的标题中显示用户的实际姓名。

所以我有我的自定义用户类:

class Users{

    String name;
    String email;
    String password;

    // getters and setters
}

我考虑过使用 aop 范围代理在会话中设置用户,如本博客所述:http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-include。 .html _ 我使用这种方法面临的问题是 AuthenticationSuccessHandler 实际上是一个服务并且应该是无状态的。所以 Spring 不会在服务中为我自动装配用户对象。

因此,我创建了一个 Service 方法,该方法将从 Authentication 对象中获取用户名(或电子邮件)并返回我的 Users 对象。我可以在我的控制器中使用它。

@Service
@Transactional
public class UserServiceImpl implements UserService {

@Override
public Users getCurrentUser() {
     Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    User userD = (User)auth.getPrincipal();

    Users currentUser = getUserByEmail(userD.getUsername());

    return currentUser;
}

}

那么有没有一种方法可以让我从 JSTL 调用这个 Service 方法来获取用户的全名,我可以将其显示在我的标题中?

我也愿意接受更好的方法来实现这一点的建议。

编辑:

在我之前使用 AuthenticationSuccessHandler 的方法中,我的代码如下所示:

@Service("userDetailsService")
@Transactional
public class UserAuthenticationServiceImpl implements AuthenticationSuccessHandler {

@Autowired
Users currentUser;

@Override
public void onAuthenticationSuccess(HttpServletRequest hsr, HttpServletResponse hsr1, Authentication a) throws IOException, ServletException {
    User user = (User) a.getPrincipal();

    Users user1 = userDao.getUserByEmail(user.getUsername());

    currentUser.setName(user1.getName());
    currentUser.setUserRoles(user1.getUserRoles());

    //currentUser = user1;

}

}

在我的 spring-servlet.xml 文件中,我有这个:

<bean id="currentUser" class="com.foo.bean.Users" scope="session">
    <!-- this next element effects the proxying of the surrounding bean -->
    <aop:scoped-proxy/>
</bean>

我在这里面临的问题是 Spring 没有自动装配我的 currentUser 对象,因为 Service 不在会话范围内。

4

1 回答 1

1

如果您唯一需要的是全名,只需使用 anAuthenticationSuccessHandler来检索用户并将名称添加到会话中(或者如果您需要更多名称,则添加完整用户)。

@Override
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication auth) throws IOException, ServletException {

    User user = (User) auth.getPrincipal();
    Users user1 = userDao.getUserByEmail(user.getUsername());
    WebUtils.setSessionAttribute(req, "currentUser" user1);
}

然后在您的 JSP 中,您唯一需要的是${currentUser.username}.

虽然我不建议在会话中填充完整用户,但我建议只添加所需的信息。

WebUtils.setSessionAttribute(req, "currentUsername" user1.getUsername());

然后在你的 JSP 中为你${currentUsername}节省了很多 session 的序列化开销。

于 2015-05-19T10:42:59.473 回答