参阅《跟我学shiro》—— 张开涛
配置CAS服务器
CAS服务器默认是不对外提供认证服务的,也就是说如果我们的应用需要使用CAS服务器做认证,必须在CAS服务器中开启认证服务,为我们的客户端应用提供认证,如果没有配置,使用我们的应用在进行认证时会抛出异常,如下:
访问异常
所以我们需要修改配置,使服务允许访问我们的CAS服务器,如下:
//1. 修改application.properties
# 表示会从json文件中读取服务配置,其他配置
# 更多请看 https://apereo.github.io/cas/5.2.x/installation/Configuration-Properties.html#service-registry
cas.serviceRegistry.initFromJson=true
//2. 修改 cas\WEB-INF\classes\services\HTTPSandIMAPS-10000001.json 使其支持 http应用的访问CAS服务端,参与单点登录
{
"@class" : "org.apereo.cas.services.RegexRegisteredService",
"serviceId" : "^(https|imaps|http)://.*",
"name" : "HTTPS and IMAPS",
"id" : 10000001,
"description" : " support HTTPS and IMAPS and HTTP protocols.",
"evaluationOrder" : 10000
}
// 3. 设置ticket过期时间
cas.ticket.tgt.maxTimeToLiveInSeconds=28800
cas.ticket.tgt.timeToKillInSeconds=7200
访问结果
生成证书,并且导入到jdk的证书库
(1)生成秘钥:keytool -genkey -keystore "G:\localhost.keystore" -alias localhost -keyalg RSA,注意,"您的名字与姓氏下方",必须填写你要访问的域名,如果是本地,使用localhost即可。在这里使用上一节生成的 localhost.keyStore即可
生成秘钥
(2)导出证书:keytool -export -alias localhost -file G:\localhost.crt -keystore G:\localhost.keystore
(3)将证书导入到jdk的证书库(进入 jre/lib/security目录下)
keytool -import -trustcacerts -alias localhost -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file g:/localhost.crt -storepass changeit
配置客户端
在shiro官网中,对集成 CAS 有更详细的描述。
(1)添加相关依赖
org.apache.shiro
shiro-cas
1.5.2
(2)配置 CasFilter 类,用来拦截回调请求,获取的票据,然后封装成需要认证的 CasToken。
// 拦截请求,重定向到 CAS服务器
/cas = cas
/** = authc
(3)配置 CasRealm ,该类使用 ssl 方式向 CAS服务器验证 CasToken的有效性,然后返回对应的认证信息。
//1. 继承 CasRealm 实现自己逻辑
public class MyCasRealm extends CasRealm {
private Logger logger = LoggerFactory.getLogger(MyCasRealm.class);
@Override
// 验证 token 的有效性都封装在 CasRealm的 doGetAuthenticationInfo 方法中
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
Object principal = token.getPrincipal();
logger.info("使用{}用户进行登录", principal);
return super.doGetAuthenticationInfo(token);
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
Object primaryPrincipal = principals.getPrimaryPrincipal();
logger.info("从数据库中查询{}用户的权限信息", primaryPrincipal);
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.addStringPermission("user:read");
authorizationInfo.addRole("admin");
return authorizationInfo;
}
}
//2. 告诉CasRealm 的CAS服务器地址和回调地址
//3. 将该 Realm 配置到 SecurityManager 中
重定向到CAS服务器
(2)输入用户名和密码开始登录
认证完成
登录完成
CAS的流程可以看cas原理,讲的很详细。