GoMind Hub

【Shiro-流程】java安全框架&cas单点登录

计算机知识思维导图:【Shiro-流程】java安全框架&cas单点登录。网页展示前三层结构,可在线查看完整脑图并下载 GoMind 文件。

2026-08-25

计算机知识学习资料思维导图
## 【Shiro-流程】java安全框架&cas单点登录
### 【Shiro-流程】java安全框架&cas单点登录
#### 系统访问 control
#### 优先Filter拦截去向
##### 本地shiro
##### 远端cas
#### cas 登陆服务
##### 登陆成功
##### 服务准备工作-配置
#### 系统退出(cas)
##### 现理解
##### 注:http://localhost:8180/manage/logOut 控制器代码中需要推出shiro以及session
#### shiro是否登陆
#### 否
##### 登陆页-loginUrl
#### 是
#### cas&cas是否登陆
#### 否
##### cas服务登陆页-loginUrl
#### 是?
#### 系统访问
##### url目标控制器
#### shiro-casFilter登录
#### shiro-MyRealm.java-doGetAuthenticationInfo 登录登记
#### shiro-casRealm.java-doGetAuthenticationInfo 登录登记

> 仅展示前三层结构;请在线查看完整脑图或下载 GoMind 文件。

【Shiro-流程】java安全框架&cas单点登录

【Shiro-流程】java安全框架&cas单点登录
系统访问 control
通过&授权role
property-unauthorizedUrl
<!-- 用户访问未对其授权的资源时,所显示的连接 -->

<property name="unauthorizedUrl" value="/logins"></property>
不通过,跳转至登录页面
登陆验证/授权信息
doGetAuthorizationInfo
setSession("loginUser", user);
获取身份验证信息/权限验证
doGetAuthenticationInfo
myRealm
securityManager
安全管理器
需要角色权限
目标 control
无权限控制
已登录
property-loginUrl
<!-- 登录时的链接 -->

<property name="loginUrl" value="/logins?p=loginUrl"></property>
未登录
shiro-FormAuthenticationFilter 验证登录过滤器
<!-- authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter -->
自定义-ShiroFilter
authc
myRealm-doGetAuthorizationInfo
目标 control
通过
shiro-securityManager 授权
authc,roles[admin] 角色权限控制
<!-- 访问 /member/queryMyUserInfo路径需要进行身份认证,并且只有当用户的角色为"member"且权限为"member:delete"时才可以访问该路径 

/member/queryMyUserInfo=authc,roles[member],perms[member:delete] -->
目标 control
anon
filterChainDefinitions
过滤器
获取用户名,密码,存放至shiro结构中
1.获取用户名,密码,存放至shiro结构中



		/** 登陆校验,存放容器shiro */

		// 根据获取的用户名和密码封装成Token

		UsernamePasswordToken token = new UsernamePasswordToken(username, password);

		// 是否记住用户

		token.setRememberMe(true);

		// 获取当前的subject

		Subject subject = SecurityUtils.getSubject();
myRealm-doGetAuthenticationInfo
subject.login(token);
System.out.println("对用户:[" + username + "]进行登录验证,验证开始...");

// 在调用了login方法后,SecurityManager会收到AuthenticationToken,并将其发送给已配置的Realm执行必须的认证检查

// 每个Realm都能在必要时对提交的AuthenticationTokens作出反应

// 所以这一步在调用login(token)方法时,它会走到MyRealm.doGetAuthenticationInfo()方法中,具体验证方式详见此方法

subject.login(token);

System.out.println("对用户:[" + username + "]进行登录验证,验证通过!");
平台首页
subject.login(token);

System.out.println("对用户:[" + username + "]进行登录验证,验证通过!");

returnUrl = "redirect:/home";
本地服务控制器 /login
为什么能进入login.do控制器

因为配置了免过滤 /login.do=anon
登陆
链接转至"loginUrl"
/logins
登录控制器 loginUrl/unauthorizedUrl
本地shiro
通过&授权role
cas-property-unauthorizedUrl
<!-- 用户访问未对其授权的资源时,所显示的连接 -->

<property name="unauthorizedUrl" value="http://localhost:8280/cas/login?service=http://localhost:8180/manage/shiro-cas"></property>
不通过,跳转至登录页面
登陆验证/授权信息
doGetAuthorizationInfo
setSession("loginUser", user);
获取身份验证信息/权限验证
doGetAuthenticationInfo
casRealm
securityManager
安全管理器
需要角色权限
目标 control
无权限控制
已登录
cas-property-loginUrl
<!--访问client1 时,如果未通过cas认证将会跳转到认证中心,通过得跳转到下面配置的successUrl 里的地址 -->

<property name="loginUrl" value="http://localhost:8280/cas/login?service=http://localhost:8180/manage/shiro-cas" />
未登录
shiro-FormAuthenticationFilter 验证登录过滤器
<!-- authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter -->
自定义-ShiroFilter
authc
目标 control
anon
casRealm-doGetAuthorizationInfo
目标 control
通过
shiro-securityManager 授权
authc,roles[admin] 角色权限控制
<!-- 访问 /member/queryMyUserInfo路径需要进行身份认证,并且只有当用户的角色为"member"且权限为"member:delete"时才可以访问该路径 

/member/queryMyUserInfo=authc,roles[member],perms[member:delete] -->
需要角色权限
property-successUrl
<!-- 登录成功后跳转到的链接 -->

<property name="successUrl" value="/home"></property>
无权限控制
登录
cas-property-failureUrl
<bean id="casFilter" class="org.apache.shiro.cas.CasFilter">

	    <property name="failureUrl" value="http://localhost:8280/cas/login?service=http://localhost:8180/manage/shiro-cas" />

	</bean>
登录失败
shiro-casFilter 登录过滤器
自定义-*Filter
cas
filterChainDefinitions
过滤器
${cas.host}/login?service=${my.host}/shiro-cas
登录控制器 loginUrl/unauthorizedUrl/failureUrl
远端cas
优先Filter拦截去向
1.过滤器拦截

shiroFilter-filterChainDefinitions

/** = authc

2.拦截处理(去向),安全管理器

shiroFilter-securityManager



3.

去向一:本地shiro

去向二:远端cas



<context-param>

	<param-name>contextConfigLocation</param-name>

	<param-value>

		/WEB-INF/spring/basicContext.xml,

		/WEB-INF/spring/applicationContext-shiro.xml

		<!--  /WEB-INF/spring/applicationContext-shiro-cas.xml -->

	</param-value>

</context-param>
回调?service=${my.host}/shiro-cas
登陆成功
deployerConfigContext.xml
<!-- dataSource@wosai -->

    <bean id="dataSource"  

      class="com.mchange.v2.c3p0.ComboPooledDataSource"  

      p:driverClass="com.mysql.jdbc.Driver"

      p:jdbcUrl="jdbc:mysql://192.168.3.198:3306/teach_platform?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"

      p:user="root"  

      p:password="" />
登陆数据库连接&MD5
https-可开关控制(多处并改)
服务准备工作-配置
cas 登陆服务
http://localhost:8280/cas/logout
http://localhost:8180/manage/logOut
需要两边logout同时都执行,下次访问才能从cas服务页登陆
理想-shiro退出时,联动推出cas 或 直接退出cas,联动推出shiro
现理解
注:http://localhost:8180/manage/logOut 控制器代码中需要推出shiro以及session
// shiro 登出

		Subject subjects = SecurityUtils.getSubject();

		subjects.logout();
系统退出(cas)
shiro是否登陆
首页
登陆页-loginUrl
否
是
cas&cas是否登陆
property-successUrl
<!-- 登录成功后跳转到的链接 -->

<property name="successUrl" value="/home"></property>
cas服务登陆页-loginUrl
否
是?
打开页面
url目标控制器
系统访问
shiro-casFilter登录
1.获得登陆名等信息

2.配合业务,可能需要将登陆信息记录到session中

3.核对令牌,不一致则走异常分支



注:如果无需获得登录名,可直接使用shiro-cas-1.2.4.jar包中的CasRealm接受安全控制
shiro-MyRealm.java-doGetAuthenticationInfo 登录登记
1.获得登陆名等信息

2.配合业务,可能需要将登陆信息记录到session中

3.核对令牌,不一致则走异常分支



注:如果无需获得登录名,可直接使用shiro-cas-1.2.4.jar包中的CasRealm接受安全控制
shiro-casRealm.java-doGetAuthenticationInfo 登录登记