Shiro是一个很简洁的安全框架,类似的Spring Security则要复杂许多。虽然spring-boot集成的是Spring Security,但我们还是选择了Shiro。
Shiro官网:http://shiro.apache.org/
Shiro单点登录cas集成:http://shiro.apache.org/cas.html。不过Shiro官方已经建议使用buji-pac4j
做单点登录集成:https://github.com/bujiio/buji-pac4j。
安全框架需要处理的事情:
Shiro使用Servlet Filter过滤器保护受访的页面,通过下面介绍的shiroFilterChainDefinitionMap
配置需要保护的页面路径。
使用AuthorizingRealm
获取用户密码及权限信息,即下面介绍的com.jspxcms.core.security.ShiroDbRealm
。
在JSP页面中使用标签<shiro:hasPermission name="my:perm:code">
判断是否有访问Controller中@RequiresPermissions("my:perm:code")
标识的方法。
配置类com.jspxcms.core.ShiroConfig
(7.0及之前版本/src/main/resources/conf/context-shiro.xml
)
权限相关的类包:com.jspxcms.core.security
加密相关的公用类包:com.ujcms.common.security
核心类:
com.jspxcms.core.security.CmsAuthenticationFilter
登录逻辑处理类。包括加入验证码判断、记录登录日志的逻辑。com.jspxcms.core.security.ShiroDbRealm
登录时查询用户名、密码及获取用户权限信息。ShiroConfig
会读取过滤器映射配置。
@Bean("shiroFilter")
@DependsOn("propertiesHelper")
public ShiroFilterFactoryBean shiroFilterFactoryBean(BeanFactory beanFactory) throws IOException {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
...
Map<String, String> filterChainDefinitionMap = propertiesHelper()
.getSortedMap("shiroFilterChainDefinitionMap.");
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
...
}
过滤器映射配置:/src/main/resources/conf/conf.properties
shiroFilterChainDefinitionMap[100]/login=authc
shiroFilterChainDefinitionMap[200]/logout=logout
shiroFilterChainDefinitionMap[300]/cmscp=backSite,anon
shiroFilterChainDefinitionMap[400]/cmscp/=backSite,anon
shiroFilterChainDefinitionMap[500]/cmscp/index.do=backSite,anon
shiroFilterChainDefinitionMap[600]/cmscp/login.do=backSite,authc
shiroFilterChainDefinitionMap[700]/cmscp/logout.do=backSite,logout
shiroFilterChainDefinitionMap[800]/cmscp/**=backSite,user
shiroFilterChainDefinitionMap[900]/my/**=user
shiroFilterChainDefinitionMap[1000]/**=anon
大致描述如下:
/my/**
/cmscp/**
路径需要登录后才能访问,如未登录则会重定向至登录页面。前者为是前台会员中心路径,后者为后台管理路径。/login
/cmscp/login.do
是登录请求。前者为前台登录请求,后者为后台登录请求。/logout
/cmscp/logout.do
是退出登录请求。/**
其他路径可以随便访问。将用户密码直接使用明文保存在数据库中是极其不安全的。要对密码进行加密后,再保存到数据库,通常的加密方式有md5
sha1
sha256
等,md5
使用的最为广泛,但由于安全性较差,已经不建议使用。系统中使用sha1
作为加密方式。
ShiroConfig
中的配置如下:
@Bean("credentialsDigest")
public SHA1CredentialsDigest credentialsDigest() {
return new SHA1CredentialsDigest();
}
这个加密对象会在com.jspxcms.core.security.ShiroDbRealm
中注入:
@Autowired
public void setCredentialsDigest(CredentialsDigest credentialsDigest) {
this.credentialsDigest = credentialsDigest;
}