cas实现单点登陆

发表时间:2018-03-20 10:59:34 浏览量( 57 ) 留言数( 0 )

学习目标:

1、了解单点登陆基本原理

2、了解Shiro整合单点登陆


学习过程:

一、cas server的搭建

  下载cas server端部署到tomcat上

1、下载cas server

 下载地址:http://developer.jasig.org/cas/

attcontent/11990f68-b34b-487a-b845-ca0f795bb157.png

源代码也可以下载

https://github.com/apereo/cas

D:\study\git>git clone https://github.com/apereo/cas

D:\study\git\cas>git checkout 4.0.x

使用eclipse打开就可以了


2、部署cas server到tomcat中

   找到解压后的/modules/cas-server-webapp-4.0.0.war文件,拷贝到tomcat根目录/webapps下,修改war包名称为servercas.war(只是为了方便浏览器输入而已)。

访问:

https://localhost/servercas/login

   此时,CAS只是单独运行,至于登录的用户名和密码是什么,请查看:cas\WEB-INF\deployerConfigContext.xml文件中有这样一段配置:

    <bean id="primaryAuthenticationHandler"
          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
        <property name="users">
            <map>
                <entry key="casuser" value="Mellon"/>
            </map>
        </property>
    </bean>

    这个配置是默认静态配置用户名和密码,那就在浏览器的CAS服务的登陆框中输入:

    用户名:casuser

    密码:Mellon

    登录看看效果,就会出现验证成功的页面,如下图。你也可以在文件中自己配置自己的用户名和密码。

   输入上面的账号密码就可以登陆了。

attcontent/0b5ff970-d4e3-4655-b95f-5cad82395f9c.png


二、Shiro整合Cas实现单点登陆

1、自定义CasRealm    

    cas事实上就是实现了认证的功能,所以我们原来的项目就很多(验证码,记住我等)就不需要了。这里我就新建了一个shriro2cas项目,cas会返回用户的登陆名,然后我们可以获得用户名称。需要自定义CasRealm:

public class MyCasRealm extends CasRealm {


	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		String username = (String) principals.getPrimaryPrincipal();

		System.out.println("用戶名:" + username);

		// 根据身份信息从数据库中查询权限数据
		List<String> roles = new ArrayList<String>();
		roles.add("role1");
		roles.add("role2");

		// ....这里使用静态数据模拟
		List<String> permissions = new ArrayList<String>();
		permissions.add("user:list");
		permissions.add("user:create");
		permissions.add("user:delete");

		System.out.println("调用了授权AuthorizationInfo......");

		// 将权限信息封闭为AuthorizationInfo
		SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
		simpleAuthorizationInfo.addStringPermissions(permissions);
		simpleAuthorizationInfo.addRoles(roles);

		return simpleAuthorizationInfo;
	}
}


xml配置

<bean id="myCasRealm" class="com.shiro.MyCasRealm">  
	    <property name="casServerUrlPrefix" value="https://localhost/servercas"/>  
	    <property name="casService" value="https://localhost:8443/shirocas/cas"/>  
	</bean> 
	<!-- 安全管理器 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="realm" ref="myCasRealm" />
		<property name="cacheManager" ref="cacheManager" />
		<property name="sessionManager" ref="sessionManager" />
	</bean>

 

casServerUrlPrefix:是CAS Server服务器端地址;

casService:是当前应用CAS服务URL,即用于接收并处理登录成功后的Ticket的;


    CasRealm根据CAS服务器端返回的用户身份获取相应的角色/权限信息。 如果角色/权限信息是由服务器端提供的话,我们可以直接使用CasRealm: 

<bean id="casRealm" class="org.apache.shiro.cas.CasRealm">  

    ……  

    <property name="defaultRoles" value="admin,user"/>  

    <property name="defaultPermissions" value="user:create,user:update"/>  

    <property name="roleAttributeNames" value="roles"/>  

    <property name="permissionAttributeNames" value="permissions"/>  

    <property name="casServerUrlPrefix" value="https://localhost:8443/chapter14-server"/>  

    <property name="casService" value="https://localhost:9443/chapter14-client/cas"/>  

</bean>   

    defaultRoles/ defaultPermissions:默认添加给所有CAS登录成功用户的角色和权限信息;

    roleAttributeNames/ permissionAttributeNames:角色属性/权限属性名称,如果用户的角色/权限信息是从服务器端返回的(即返回的CAS Principal中除了Principal之外还有如一些Attributes),此时可以使用roleAttributeNames/ permissionAttributeNames得到Attributes中的角色/权限数据;请自行查询CAS获取用户更多信息。

 

2、过滤器配置

 CasFilter类似于FormAuthenticationFilter,只不过其验证服务器端返回的CAS Service Ticket。 

    <bean id="casFilter" class="org.apache.shiro.cas.CasFilter">  
       <property name="failureUrl" value="/casFailure.jsp"/>  
    </bean>    

	<!-- Shiro 的Web过滤器 -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<!-- loginUrl认证提交地址,如果没有认证将会请求此地址进行认证,请求此地址将由formAuthenticationFilter进行表单认证 -->
		<property name="loginUrl" value="https://localhost/servercas/login?service=https://localhost:8443/shirocas/cas"/>  
		<property name="successUrl" value="/"/>  
		<property name="unauthorizedUrl" value="/refuse.do" />
		<!-- 过虑器链定义,从上向下顺序执行,一般将/**放在最下边 -->

		<property name="filters">
			<map>
				<entry key="ssl" value-ref="sslFilter"/>  
				<entry key="cas" value-ref="casFilter"/>  
			</map>
		</property>

		<property name="filterChainDefinitions">
			<value>
				<!-- 退出拦截,由shiro拦截并实现,所以你不需要自己在mvc配置这样的一个方法了。 -->
				/logout.do = logout
				<!-- 不需要权限拦截 -->
				/do.jsp = anon
				/cerCode.do = anon

				/js/** anon
				/images/** anon
				/styles/** anon

				<!-- roles[XX]表示有XX角色才可访问 -->
				/item/list.do = roles[item],authc

				<!-- 本地项目的地址,注意和casService的路径是一致的 -->
				/cas = ssl,cas  
				/** = user
				<!--/** = user,changedPassword -->
			</value>
		</property>
	</bean>

    loginUrl:https://localhost:8443/chapter15-server/login表示服务端端登录地址,登录成功后跳转到?service参数对于的地址进行客户端验证及登录;

   “/cas=cas”:即/cas地址是服务器端回调地址,使用CasFilter获取Ticket进行登录。


测试一下。现在我们登陆,会自动调整到cas项目,登陆成功后就会自动跳回来successurl指定的路径

先访问这个页面

https://localhost:8443/shirocas

自动跳去了cas的单点登陆页面

https://localhost/servercas/login?service=https://localhost:8443/shirocas/cas

attcontent/3a4d1bf3-394d-441b-9fa9-4ce50ce303a7.png

输入账号密码后点击登陆

    用户名:casuser

    密码:Mellon

attcontent/2f590b82-651c-4519-92b1-7ca273e7a2da.png

这样就可以完成单点登陆了。有关cas的配置还有很多内容,我们下一节课再说。