spring + shiro + cas 实现sso单点登录的示例代码

sso-shiro-cas

spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次,项目源码

系统模块说明

1.cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已
2.doc: 文档目录,里面有数据库生成语句,采用的是MySQL5.0,数据库名为db_test
3.spring-node-1: 应用1
4.spring-node-2: 应用2

其中node1跟node2都是采用spring + springMVC + mybatis 框架,使用maven做项目管理

cas集成说明

1.首先采用的是查数据库的方式来校验用户身份的,在cas/WEB-INF/deployerConfigContext.xml中第135行构建了这个类型

<!-- 设置密码的加密方式,这里使用的是MD5加密 -->
  <bean id="passwordEncoder"
   class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
   c:encodingAlgorithm="MD5"
   p:characterEncoding="UTF-8" />

 <!-- 通过数据库验证身份,这个得自己去实现 -->
  <bean id="primaryAuthenticationHandler"
   class="com.distinct.cas.jdbc.QueryDatabaseAuthenticationHandler"
   p:dataSource-ref="dataSource"
   p:passwordEncoder-ref="passwordEncoder"
   p:sql="select password from t_user where account=? and status = 'active'" />

 <!-- 设置数据源 -->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/db_test?useUnicode=true&characterEncoding=utf8"></property>
     <property name="username" value="root"></property>
     <property name="password" value="123456"></property>
 </bean>

其中QueryDatabaseAuthenticationHandler这个类是自定义构建的,在cas/WEB-INF/lib/cas-jdbc-1.0.0.jar里面,有兴趣的同学可以发编译看下,关于几个属性的说明

1.dataSource: 数据源,配置MySQL的连接信息
2.passwordEncoder: 加密方式,这里用的是MD5
3.sql: sql查询语句,这个语句就是根据用户输入的账号查询其密码

以上就是单点登录管理的主要配置

应用系统的配置node1

1.应用系统采用shiro做权限控制,并且跟cas集成

2.在/spring-node-1/src/main/resources/conf/shiro.properties 文件中

``` properties
shiro.loginUrl=http://127.0.0.1:8080/cas/login?service=http://127.0.0.1:8081/node1/shiro-cas

shiro.logoutUrl=http://127.0.0.1:8080/cas/logout?service=http://127.0.0.1:8081/node1/shiro-cas

shiro.cas.serverUrlPrefix=http://127.0.0.1:8080/cas

shiro.cas.service=http://127.0.0.1:8081/node1/shiro-cas

shiro.failureUrl=/users/loginSuccess

shiro.successUrl=/users/loginSuccess

```

其中shiro.loginUrl 跟 shiro.logoutUrl的前面是cas验证的地址,后面的是我们应用系统的地址,这样配置的方式是为了在访问我们的应用系统的时候,先到cas进行验证,如果验证成功了,cas将重定向到shiro.successUrl 所表示的地址

3.在/spring-node-1/src/main/resources/conf/shiro.xml 文件中

<!-- Shiro Filter -->
  <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />
    <!-- 设定用户的登录链接,这里为cas登录页面的链接地址可配置回调地址 -->
    <property name="loginUrl" value="${shiro.loginUrl}" />
    <property name="filters">
      <map>
        <!-- 添加casFilter到shiroFilter -->
        <entry key="casFilter" value-ref="casFilter" />
        <entry key="logoutFilter" value-ref="logoutFilter" />
      </map>
    </property>
    <property name="filterChainDefinitions">
      <value>
        /shiro-cas = casFilter
        /logout = logoutFilter
        /users/** = user
      </value>
    </property>
  </bean>

  <bean id="casFilter" class="org.apache.shiro.cas.CasFilter">
    <!-- 配置验证错误时的失败页面 -->
    <property name="failureUrl" value="${shiro.failureUrl}" />
    <property name="successUrl" value="${shiro.successUrl}" />
  </bean>

  <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter">
    <!-- 配置验证错误时的失败页面 -->
    <property name="redirectUrl" value="${shiro.logoutUrl}" />
  </bean>

  <bean id="casRealm" class="com.spring.mybatis.realm.UserRealm">
    <!-- 认证通过后的默认角色 -->
    <property name="defaultRoles" value="ROLE_USER" />
    <!-- cas服务端地址前缀 -->
    <property name="casServerUrlPrefix" value="${shiro.cas.serverUrlPrefix}" />
    <!-- 应用服务地址,用来接收cas服务端票据 -->
    <property name="casService" value="${shiro.cas.service}" />
  </bean>

  <!-- Shiro's main business-tier object for web-enabled applications -->
  <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="subjectFactory" ref="casSubjectFactory"></property>
    <property name="realm" ref="casRealm" />
  </bean>

  <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"></bean>

  <bean
    class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager" />
  </bean>

  <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean>
  <bean
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="staticMethod"
      value="org.apache.shiro.SecurityUtils.setSecurityManager"></property>
    <property name="arguments" ref="securityManager"></property>
  </bean>

其中shiroFilter这个类主要用于需要拦截的url请求,需要注意的是这个是shiro的拦截,我们还需要配置cas的过滤配置casFilter

casRealm这个类是需要我们自己实现的,主要用于shiro的权限验证,里面的属性说明如下

1.defaultRoles: 默认的角色
2.casServerUrlPrefix: cas地址
3.casService: 系统应用地址

最后我们还需要在/spring-node-1/src/main/webapp/WEB-INF/web.xml 文件中配置相关的过滤器拦截全部请求

<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
      <param-name>targetFilterLifecycle</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

系统运行

1.端口说明,cas:8080,node1:8081,node2:8082,大家可以采用maven提供的tomcat7插件,配置如下:

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.1</version>
    <configuration>
      <port>8081</port>
      <uriEncoding>UTF-8</uriEncoding>
      <server>tomcat7</server>
      <path>/node1</path>
    </configuration>
  </plugin>

这样的配置,我们甚至都不需要配置tomcat服务器了,建议这种方式

2.各个模块的访问地址

cas:http://127.0.0.1:8080/cas

node1:http://127.0.0.1:8081/node1

node2:http://127.0.0.1:8082/node2

3.访问系统

输入 http://127.0.0.1:8081/node1/shiro-cas ,进入cas验证

输入用户名 admin,密码 admin@2015,验证成功后将会重定向到http://127.0.0.1:8081/node1//users/loginSuccess ,也就是node1系统的主页,里面的节点2代表的是node2系统的主页,你会发现我们不需要登录到node2系统就能访问其中的系统了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ASP.NET MVC SSO单点登录设计与实现代码

    实验环境配置 HOST文件配置如下: 127.0.0.1 app.com 127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名,两个完全不同域的域名. app.com网站配置如下:  sso.com网站配置如下: memcached缓存: 数据库配置: 数据库采用EntityFramework 6.0.0,首次运行会自动创建相应的数据库和表结构. 授权验证过程演示: 在浏览器地址栏中访问:http://app.com,如果

  • 详解可跨域的单点登录(SSO)实现方案【附.net代码】

    SSO简介 定义: 传统的单站点登录访问授权机制是:登录成功后将用户信息保存在session中,sessionId保存在cookie中,每次访问需要登录访问的资源(url)时判断当前session是否为空,为空的话跳转到登录界面登录,不为空的话允许访问. 单点登录是一种多站点共享登录访问授权机制,访问用户只需要在一个站点登录就可以访问其它站点需要登录访问的资源(url).用户在任意一个站点注销登录,则其它站点的登录状态也被注销.简而言之就是:一处登录,处处登录.一处注销,处处注销. 应用场景:

  • SSO单点登录的PHP实现方法(Laravel框架)

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于表达力. 简单说一下我的逻辑,我也不知道我理解sso对不对. 假如三个站点 a.baidu.com b.baidu.com c.baidu.com a.baidu.com 作为验证用户登录账户. b和c作为客户端(子系统). b和c需要登录的时候跳转到a,并且携带参数source指明登陆后跳转的链接

  • ASP.NET实现单点登陆(SSO)适用于多种情况

    第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web.config里Authentication节form设定的name信息,如 复制代码 代码如下: <authentication mode="Forms"> <forms loginUrl="login.aspx" name=".ASPXAU

  • 基于.Net的单点登录(SSO)实现解决方案

    前些天一位朋友要我帮忙做一单点登录,其实这个概念早已耳熟能详,但实际应用很少,难得最近轻闲,于是决定通过本文来详细描述一个SSO解决方案,希望对大家有所帮助.SSO的解决方案很多,但搜索结果令人大失所望,大部分是相互转载,并且描述的也是走马观花. 闲话少叙,进入正题,我的想法是使用集中验证方式,多个站点集中Passport验证. 如下图所示:  为方便清晰描述,先定义几个名词,本文中出现之处均为如下含义. 主站:Passport集中验证服务器 http://www.passport.com/ .

  • php实现的SSO单点登录系统接入功能示例分析

    本文实例讲述了php实现的SSO单点登录系统接入功能.分享给大家供大家参考,具体如下: SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方案之一,下面我们来看看吧. 简单讲一下 SSO 单点登录系统的接入的原理,前提是系统本身有完善的用户认证功能,即基本的用户登录功能,那做起来就很方便了. SSO 登录请求接

  • php的sso单点登录实现方法

    本文实例讲述了php的sso单点登录实现方法.分享给大家供大家参考.具体分析如下: 这里详细讲到了几点: 1.点击登录跳转到SSO登录页面并带上当前应用的callback地址 2.登录成功后生成COOKIE并将COOKIE传给callback地址 3.callback地址接收SSO的COOKIE并设置在当前域下再跳回到应用1即完成登录 4.再在应用程序需要登录的地方嵌入一个iframe用来实时检测登录状态,代码如下: index.php 应用程序页面: 复制代码 代码如下: <?php  hea

  • 浅谈谁都能看懂的单点登录(SSO)实现方式(附源码)

    SSO的基本概念 SSO英文全称Single Sign On(单点登录).SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方案之一.(本段内容来自百度百科) 今天这篇文章将介绍SSO的一种实现方式,代码超简单,仅用来验证我的思路是否可行,具体细节请大家来完善! 二级域名的单点登录 什么是二级域名呢?例如: site1.domain.com site2.domai

  • asp.net简单实现单点登录(SSO)的方法

    本文实例讲述了asp.net简单实现单点登录(SSO)的方法.分享给大家供大家参考,具体如下: 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统 CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架(耶鲁大学开发)主要用于Java Php 有兴趣大家可以研究下.. 下面是一个简单实现单点登录的

  • spring + shiro + cas 实现sso单点登录的示例代码

    sso-shiro-cas spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次,项目源码 系统模块说明 1.cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已 2.doc: 文档目录,里面有数据库生成语句,采用的是MySQL5.0,数据库名为db_test 3.spring-node-1: 应用1 4.spring-node-2: 应用2 其中node1跟node2都是采用spring + springMVC + mybatis 框架,使用ma

  • SpringCloud实现SSO 单点登录的示例代码

    前言 作为分布式项目,单点登录是必不可少的,文本基于之前的的博客(猛戳:SpringCloud系列--Zuul 动态路由,SpringBoot系列--Redis)记录Zuul配合Redis实现一个简单的sso单点登录实例 sso单点登录思路: 1.访问分布式系统的任意请求,被Zuul的Filter拦截过滤 2.在run方法里实现过滤规则:cookie有令牌accessToken且作为key存在于Redis,或者访问的是登录页面.登录请求则放行 3.否则,将重定向到sso-server的登录页面且

  • springboot集成CAS实现单点登录的示例代码

    最近新参与的项目用到了cas单点登录,我还不会,这怎么能容忍!空了学习并搭建了一个spring-boot 集成CAS 的demo.实现了单点登录与登出. 单点登录英文全称是:Single Sign On,简称SSO. 含义:在多个相互信任的系统中,只要登录一个系统其他系统均可访问. CAS 是一种使用广泛的单点登录实现,分为客户端CAS Client和服务端 CAS Service,客户端就是我们的系统,服务端是认证中心,由CAS提供,我们需要稍作修改,启动起来就可以用.~~~~ 效果演示 ht

  • spring cloud oauth2 实现用户认证登录的示例代码

    需求 在微服务架构中,我们有很多业务模块,每个模块都需要有用户认证,权限校验.有时候也会接入来自第三方厂商的应用.要求是只登录一次,即可在各个服务的授权范围内进行操作.看到这个需求,立马就想到了这不就是单点登录吗?于是基于这样的需求,作者使用spring-cloud-oauth2去简单的实现了下用户认证和单点登录. 相关介绍 OAuth2 OAuth2是一个关于授权的网络标准,他定制了设计思路和执行流程.OAuth2一共有四种授权模式:授权码模式(authorization code).简化模式

  • SpringBoot整合Keycloak实现单点登录的示例代码

    目录 1. 搭建Keycloak服务器 2. 配置权限 2.1. 登陆 2.2. 创建Realm 2.3. 创建用户 2.4. 创建客户端 2.5. 创建角色 2.6. 配置用户角色关系 2.7. 配置客户端和角色关系 3. 整合SpringBoot 3.1. 引入核心依赖 3.2. 编写Controller 3.3. 编写application.yml 4. 验证 Keycloak是一个开源的身份和权限访问管理工具,轻松为应用程序和安全服务添加身份验证,无需处理储存用户或者验证用户,其提供用户

  • springboot简单实现单点登录的示例代码

    什么是单点登录就不用再说了,今天通过自定义sessionId来实现它,想了解的可以参考https://www.xuxueli.com/xxl-sso/ 讲一下大概的实现思路吧:这里有一个认证中心,两个单独的服务.每个服务去请求的 时候都要经过一个过滤器,首先判断该请求地址中有没有sessionid,有的话则写入cookie ,如果请求地址中没有sessionid那么从cookie中去获取,如果cookie中获取到了则证明登录了,放行即可.否则跳转到认证中心,此时把请求地址当做参数带到认证中,认证

  • spring boot整合Shiro实现单点登录的示例代码

    Shiro是什么 Shiro是一个Java平台的开源权限框架,用于认证和访问授权.具体来说,满足对如下元素的支持: 用户,角色,权限(仅仅是操作权限,数据权限必须与业务需求紧密结合),资源(url). 用户分配角色,角色定义权限. 访问授权时支持角色或者权限,并且支持多级的权限定义. Q:对组的支持? A:shiro默认不支持对组设置权限. Q:是否可以满足对组进行角色分配的需求? A:扩展Realm,可以支持对组进行分配角色,其实就是给该组下的所有用户分配权限. Q:对数据权限的支持? 在业务

  • Spring Cloud OAuth2 实现用户认证及单点登录的示例代码

    OAuth 2 有四种授权模式,分别是授权码模式(authorization code).简化模式(implicit).密码模式(resource owner password credentials).客户端模式(client credentials),具体 OAuth2 是什么,可以参考这篇文章.(http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html) 本文我们将使用授权码模式和密码模式两种方式来实现用户认证和授权管理. OAuth2 其

  • 使用springboot结合vue实现sso单点登录

    本文实例为大家分享了springboot vue实现sso单点登录的具体代码,供大家参考,具体内容如下 项目结构: 开发工具:idea, maven3 静态文件下载地址 1.pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or

  • Spring Security基于JWT实现SSO单点登录详解

    SSO :同一个帐号在同一个公司不同系统上登陆 使用SpringSecurity实现类似于SSO登陆系统是十分简单的 下面我就搭建一个DEMO 首先来看看目录的结构 其中sso-demo是父工程项目 sso-client .sso-client2分别对应2个资源服务器,sso-server是认证服务器 引入的pom文件 sso-demo <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q

随机推荐