前言
本文讲述了作者基于shiro如何实现分布式session和url权限验证。
代码
shiro,自定义实现分布式session,url权限验证。https://github.com/chlInGithub/shirodemo
实现原理
实现分布式session
默认生成ServletContainerSessionManager bean,其内部使用httpsession,与sessionDao无关。由于需要通过sessionDao实现分布式session,所以不能使用该sessionManager。
// org.apache.shiro.spring.web.config.AbstractShiroWebConfiguration#sessionManager
protected SessionManager sessionManager() {
if (useNativeSessionManager) {
return nativeSessionManager();
}
return new ServletContainerSessionManager();
}
shiro针对web场景,提供了一个默认sessionManager,其内部会使用到sessionDao。
org.apache.shiro.web.session.mgt.DefaultWebSessionManager
@Bean
protected SessionManager sessionManager(SessionDAO sessionDAO) {
DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
defaultWebSessionManager.setSessionDAO(sessionDAO);
return defaultWebSessionManager;
}
选择好sessionManager之后,需要自定义实现sessionDao了,在其中提供分布式session解决方案。
com.example.demo.config.session.CustomSessionDao
实现url权限验证
url代表了一个操作,可作为功能权限。shiro本身没有提供支持,所以需要自行实现。由于shiro是基于filter实现的,所以我也采用filter。
另一方面,shiro以subject为中心,所以身份认证或授权验证都是直接调用subjectAPI。
// com.example.demo.config.filter.UrlPermAccessControlFilter
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
Subject subject = SecurityUtils.getSubject();
String requestURI = request.getRequestURI();
boolean permitted = subject.isPermitted(requestURI);
if (!permitted) {
response.sendRedirect("/unauthorized.html");
return;
}
filterChain.doFilter(request, response);
}
至此,分布式session和url权限验证已经可以满足要求。其中重点在于sessionDao和subject的使用。
你还可以查看