【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&characterEncoding=UTF-8&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 登录登记