bes*_*art 4 spring spring-security
我正在使用 Spring Security 来管理我的 Web 应用程序中的身份验证。使用它,我可以根据用户名管理对某些对象的访问。
因此,在我的 DAO 级别中,我有这个方法,它为我提供了用户的 Park 对象列表
public List<Park> findParkByUser(int offset) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
List<Park> parks = new ArrayList<Park>();
try {
if(auth != null){
String name = auth.getName();
User user = userService.findBySso(name);
int userId = user.getId();
Criteria criteria = createEntityCriteria();
criteria.createAlias("users", "u");
if(offset >= 0){
criteria.add(Restrictions.eq("u.id", userId)).setFirstResult(offset).setMaxResults(elementsPerPage);
}
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
parks = (List<Park>) criteria.list();
} else {
logger.debug("Auth error");
}
} catch (NullPointerException e) {
logger.error("Auth error",e);
}
return parks;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,当会话超时或cookie过期时,我会得到一个nullauth。我想将用户重定向到登录页面,但我处于 DAO 级别,而不是控制器级别。我想我可以从控制器 HttpServeletRequest 和 Response 获取并使用自定义注销管理器
public void logout(HttpServletRequest request, HttpServletResponse response) {
CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler();
cookieClearingLogoutHandler.logout(request, response, null);
securityContextLogoutHandler.logout(request, response, null);
}
Run Code Online (Sandbox Code Playgroud)
这是正确的操作方式还是有更好的解决方案?
谢谢
如果身份验证和授权配置正确,则该Authentication对象不应为null. 这种情况应该由 servlet 过滤器(或者您用于将 Spring Security 与 Web 应用程序环境集成的任何方法)捕获。
如果配置正确,可能有两种情况:
Authentication代表此匿名身份验证的对象。WebSecurityConfigurerAdapter使用 Java 配置时,可以通过提供从应用程序上下文中派生的对象来配置详细信息。假设您允许匿名访问,但某些操作需要身份验证,处理此问题的正确方法(如果您无法在控制器级别检测到它)是让您的模型抛出一个AccessDeniedException. 然后可以通过负责ExceptionTranslationFilter重定向到登录页面的异常来处理此异常。
有关如何正确设置在 Web 应用程序中使用 Spring Security 时所需的过滤器的详细说明,请参阅Spring Security参考。
在任何情况下,您都不应尝试访问 DAOHttpServletRequest或HttpServletResponse从 DAO 访问。它违反了模型代码不应依赖于控制器的一般契约,并使整个代码更难以理解。例如,您的 DAO 稍后可能会被不同的代码(例如 Web 服务 API、应用程序服务器等)使用,这些代码以非常不同的方式处理身份验证和授权,甚至没有 HTTP 请求上下文。在这种情况下,您的 DAO 将无法再正常工作。当仅使用Authentication对象并抛出DAO 时AccessDeniedException,您的 DAO 仍然是可移植的并且可以在任何环境中使用。
| 归档时间: |
|
| 查看次数: |
22061 次 |
| 最近记录: |