spring+shiro+cas ssoシングルポイント登録を実現するコード例


sso-shiro-cas
springの下でshiro+casを使って単点登録を配置して、複数のシステムの間の訪問、毎回一回だけ登録しなければならなくて、プロジェクトのソースコード
システムモジュールの説明
1.as:単点登録モジュールで、ここで直接持っているのはcasの項目が仕様を変えただけです。
2.doc:ドキュメントディレクトリの中にデータベース生成文があります。MySQL 5.0を採用しています。データベース名はdb_です。test
3.spring-node-1:応用1
4.spring-node-2:応用2
その中のnode 1とnode 2はspring+springMVC+mybatisフレームを採用して、mavenを使ってプロジェクト管理をします。
cas集積説明
1.まずデータベースを調べる方式を採用して、ユーザーのアイデンティティをチェックします。cas/WEB-INF/deployer ConfigConfigContect.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&amp;characterEncoding=utf8"></property>
     <property name="username" value="root"></property>
     <property name="password" value="123456"></property> 
 </bean>

QueryDatabaseAuthentication Handlerという種類はカスタムで構築されています。cas/WEB-INF/lib/cas-jdbc-1.0.jarの中で、興味がある人はコンパイルをしてみてください。いくつかの属性について説明します。
1.dataSource:データソース、MySQLの接続情報を配置する
2.password Ender:暗号化方式は、ここで使うのはMD 5です。
3.sql:sqlクエリ文、この文はユーザーが入力したアカウントに基づいてパスワードを調べます。
以上がワンポイント登録管理の主な構成です。
アプリケーションシステムの構成node 1
1.アプリケーションシステムはshiroを使用して権限制御を行い、casと一体化する。
2.spring-node-1/src/main/resource/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.logirlとshiro.logout Urlの前はcasが検証した住所で、後ろは私達のアプリケーションシステムのアドレスです。このように構成されているのは、私達のアプリケーションシステムにアクセスする時に、casに検証を行います。もし認証が成功したら、casはshiro.success Urlが示すアドレスにリダイレクトします。
3.spring-node-1/src/main/resource/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のフィルター配置cas Filterも必要です。
casRealmという類は、私達自身が実現する必要があります。主にshiroの権限検証に用いられます。中の属性説明は以下の通りです。
1.defaultRoles:デフォルトのキャラクター
2.cas ServerUrlProfix:cas住所
3.cas Service:システム応用住所
最後に私達は更に/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、node 1:8081、node 2:8082、皆さんはmavenが提供するtomcat 7プラグインを採用して、下記のように配置できます。

<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
node 1:http://127.0.0.1:8081/node1
node 2: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 つまり、node 1システムのホームページです。中のノード2はnode 2システムのホームページを表しています。node 2システムに登録しなくてもアクセスできるシステムを発見します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。