シロとは何ですか
Shiroは、認証とアクセスの承認のためのJavaプラットフォームのオープンソース許可フレームワークです。具体的には、次の要素のサポートが満たされています。
Q:グループのサポート?
A:Shiroは、デフォルトでグループの設定権限をサポートしていません。
Q:グループの役割割り当てのニーズを満たすことができますか?
A:拡張レルムは、グループへの役割の割り当てをサポートできます。これは、実際にはグループの下のすべてのユーザーにアクセス許可を割り当てることです。
Q:データ許可のサポート?ビジネスシステムで定義されていますか?
A:Shiroは、フロントエンド制御要素を非表示または表示し、リソースアクセス許可を確認するために使用される操作許可の制御のみを実装します。データ許可は特定のビジネスニーズに密接に関連しており、Shiro自体はデータ許可を制御できません。
Q:動的許可の割り当て?
A:org.apache.shiro.realm.realmを拡張して、動的な許可の割り当てをサポートします。
Q:春と統合しますか?
A:Springとの統合をサポートすることができ、ShiroはJSPタグもサポートしています。
前のブログでは、Shiroの2つの最大の機能、認証と承認について説明しました。シングルサインオンも認証の一部です。デフォルトでは、ShiroはCASとの統合を実装しており、統合構成を追加しても問題ありません。
1. Shiro-Casパッケージを追加します
<! - shiroはCASシングルポイントを統合します - > <依存関係> <groupid> org.apache.shiro </groupid> <artifactid> shiro-cas </artifactid> <バージョン> 1.2.4 </version> </dependency>
2.シングルサインオン構成を追加します
ここでは、すべての構成を簡単に参照できるように投稿しました。詳細な指示が構成に追加されました。
パッケージcom.chhliu.springboot.shiro.config; java.util.linkedhashmapをインポートします。 java.util.mapをインポートします。 javax.servlet.filterをインポートします。 org.apache.shiro.cache.ehcache.ehcachemanagerをインポートします。 org.apache.shiro.cas.casfilterをインポートします。 org.apache.shiro.cas.cassubjectFactoryをインポートします。 org.apache.shiro.spring.lifecybeanpostprocessorをインポートします。 org.apache.shiro.spring.security.interceptor.authorizationAttributesourceadvisorをインポートします。 Import org.apache.shiro.spring.web.shirofilterfactorybean; org.apache.shiro.web.mgt.defaultwebsecuritymanagerをインポートします。 import org.jasig.cas.client.session.singlesignoutfilter; import org.jasig.cas.client.session.singlesignouthttssessionlistener; Import org.springframework.aop.framework.autoproxy.defaultadvisorautoproxycreator; Import org.springframework.boot.web.servlet.filterregistrationbean; Import org.springframework.boot.web.servlet.servletlistenerRegistrationBean; org.springframework.context.annotation.beanをインポートします。 org.springframework.context.annotation.configurationをインポートします。 org.springframework.context.annotation.dependsonをインポートします。 Import org.springframework.core.Ordered; Import org.springframework.core.annotation.order; Import org.springframework.web.filter.delegatingFilterProxy; /*** Shiro Configuration** Apache Shiro Coreは、SpringMVCがDispachServletを使用してそれを制御するのと同じように、フィルターを介して実装されます。 *フィルターを使用するため、通常、フィルタリングと許可の検証はURLルールを使用して行われると推測できます。したがって、URLに関する一連のルールとアクセス権を定義する必要があります。 * * @author chhliu */@configuration public class shiroconfiguration {// cas serverアドレスpublic static final string casserverurlprefix = "http://127.0.0.1"; // cas loginページアドレスpublic static final string casloginurl = casserverurlprefix + "/login"; // cas logoutページアドレスpublic static final string caslogouturl = casserverurlprefix + "/logout"; //プロジェクトが外の世界に提供する現在のサービスアドレスは、パブリックスタティック最終文字列shiroserverurlprefix = "http://127.0.1.28:8080"; // casfilter urlpattern public static final string casfilterurlpattern = "/index"; //ログインアドレスpublic static final string loginurl = casloginurl + "?service =" + shiroserverurlprefix + casfilterurlpattern; //ログアウトアドレス(Casserverがサービスジャンプ機能を有効にすると、cas.logout.followserviceredirects = webapps/cas/cas/cas.propertiesファイルでtrueを有効にする必要があります。 //成功したアドレスをログインする// public static final string loginsuccessurl = "/index"; //許可認証失敗ジャンプアドレスpublic static final string unauthorizeurl = "/error/403.html"; / ** *Instantiate SecurityManager、このクラスはshiroのコアクラス */ @return */ @bean public defaultwebsecuritymanager securitymanager(){defaultwebsecuritymanager securitymanager = new defaultwebsecuritymanager(); SecurityManager.setrealm(myshirocasrealm()); // <! - ユーザー認証/認証情報キャッシュ、ehcacheキャッシュを使用 - > securitymanager.setcachemanager(getehcachemanager()); // subjectactoryを指定します。 CASのRemember Me機能を実装する場合は、次のcassubjectFactoryを使用して、SecurityManager SubjectFactory SecurityManager.SetsubjectFactory(new CassubjectFactory())に設定する必要があります。 Return SecurityManager; } / *** CACHE* @RETURN* / @BEAN PUBLIC EHCACHEMANAGER GETEHCACHEMANAGER(){EHCACHEMANAGER em = new EhcacheManager(); em.setCachemanagerconfigfile( "classpath:config/ehcache-shiro.xml"); emを返します。 } /*** realmを構成します。 Casrealmを使用しているため、単一のサインオン関数が統合されています * @param Cachemanager * @return */ @bean Public Myshirorealm Myshirocasrealm(){myshirorealm remolm = new myshirorealm(); // cas login serverアドレスプレフィックスrealm.setcasserverurlprefix(shiroconfiguration.casserverurlprefix); //クライアントコールバックアドレス、ログインが成功した後のジャンプアドレス(独自のサービスアドレス)realm.setcasservice(shiroconfiguration.shiroserverurlprefix + shiroconfiguration.casfilterurlpattern); //ログインが成功した後のデフォルトのロール、ここではデフォルトでユーザーロールremam.setDefaultroles( "user");戻り領域; }/ ** *登録シングルサインアウトリスナー * @return */ @suppresswarnings({"rawtypes"、 "unchecked"})@bean @order(ordered.highest_precedence) new ServleTListenerRegistrationBean(); bean.setListener(new Singlesignouthtttssessionlistener()); bean.setEnabled(true);豆を返します。 } / ** *登録シングルサインアウトフィルター * @return * / @bean public filterregistrationbean singleSignoutfilter(){filterregistrationbean bean = new FilterRegistrationBean(); bean.setname( "SingleSignoutfilter"); bean.setfilter(new SingleSignoutfilter()); bean.addurlpatterns( "/*"); bean.setEnabled(true);豆を返します。 } / ** * register DelegatingFilterProxy(shiro) * / @bean public filterRegistrationBean DelegatingFilterProxy(){filterregistrationbean filterRegistration = new FilterRegistrationBean(); filterregistration.setfilter(new DelegatingFilterProxy( "Shirofilter")); //この値はデフォルトでfalseであり、ライフサイクルがSpringApplicationContextによって管理されていることを示します。 Trueに設定されていることは、ServletContainerがFilterRegistration.AddinitParameter( "TargetFilterlifecycle"、 "true")によって管理されることを意味します。 filterregistration.setEnabled(true); filterregistration.addurlpatterns( "/*"); FilterRegistrationを返します。 } / ***このクラスは、org.apache.shiro.util.util.initializableインターフェイスを実装するshiroオブジェクトのinitまたはdestoryメソッドが自動的に呼び出されることを保証できます。* init-methodまたはdestory-methodメソッドを手動で指定することなく*注:このクラスが使用される場合は、初期化方法と @ @edturn methodは、最初の指定を行う必要はありません。 「LifeCycleBeanPostProcessor」)Public LifeCycleBeanPostProcessor getLifeCycleBeanPostProcessor(){return new lifecyclebeanpostprocessor(); } /***次の2つの構成は、主にShiro AOPアノテーションサポートを有効にするために使用されます。プロキシメソッドを使用します。したがって、コードサポートを有効にする必要があります。 * @return */ @bean @dependson( "lifecyclebeanpostprocessor")public defaultadvisorautoproxycreator getdefaultoproxycreator(){defaultadvisorautoproxycreator daap = new DefaultAdvisoroxycreator(); daap.setproxytargetclass(true); DAAPを返します。 } / ** * @param securitymanager * @return * / @bean public AutherizationAttributesOurceadvisor getAuthorizationAttributesourceadvisor(defaultwebsecuritymanager securitymanager){authizationAttributesceadvisor authorizationAttributeoutourceadvisor authisizationAttributesourceadvisor.setsecuritymanager(securitymanager); authorizationAttributesourceadvisorを返します。 } / *** casフィルター* @return* / @bean(name = "casfilter")public casfilter getCasFilter(){casFilter casfilter = new casfilter(); casfilter.setname( "casfilter"); casfilter.setEnabled(true); //ログインが失敗した後にジャンプするURL、つまり、shiroはcasrealmのdogetauthenticationinfoメソッドを実行してtiket casfilter.setfailureurl(loginurl); CASFILTERを返します。 } / ** *工場モードを使用してシロフィルターの作成と初期化 * @param securitymanager * @param casfilter * @return * / @bean(name = "shirofilter")public shirofilterfactorybean getshirofactorybean(defaultwebsecuritymanager securityer、casfilter casfiltertertertheven = new shirofilterfactorybean(); // SecurityManagerは、shirofilterfactorybean.setsecuritymanager(securitymanager)を設定する必要があります。 //デフォルトを設定しない場合、Webプロジェクトのルートディレクトリに「/login.jsp」ページが自動的に見つかります。 / * *ログインが成功した後にリダイレクトされる接続。設定されていない場合、デフォルトで前のURLにジャンプします。 *たとえば、最初にhttp:// localhost:8080/userlistをブラウザに入力しましたが、ユーザーがログインしていないため、ログインページにジャンプします。ログイン認証が渡された後、 *ページは、ログインが成功した後、インデックスページの代わりにhttp:// localhost:8080/userlistページに自動的にジャンプします。このフィールドは設定することをお勧めしません */ // shirofilterfactorybean.setsuccessurl(loginsuccessurl); //ページへの許可されていないアクセスを設定しましたshirofilterfactorybean.setunauthorizedurl(unauthorizedurl); / * * CasFilterをShirofilterに追加します。 CasFilterはShirofilterの前に配置する必要があることに注意してください。 * Shiro Login Login */ Map <String、Filter> Filters = new LinkedHashmap <>()を入力する前にプログラムが単一点認証を入力することを確認する必要があることに注意してください。 filters.put( "casfilter"、casfilter); //ログアウトは単一ポイントログアウトに置き換えられました// filters.put( "logout"、logoutfilter()); shirofilterfactorybean.setfilters(フィルター); loadshirofilterchain(shirofilterfactorybean); shirofilterfactorybeanを返します。 } /***シロフィルター許可制御ルール(データベースから読み取り、構成)をロードすると、myshirocasrealmオブジェクトによって役割 /許可情報が提供されます。 dogetAuthorizationInfo実装。 *ルールのこの部分は、生産中にデータベースに配置されます * @param shirofilterfactorybean */private void loadshirofilterchain(shirofilterfactorybean shirofilterfactorybean){/////////////////////ここに追加されたフィルターは整然とする必要があるため、Linkedhashmap ////////////////////////////////////////////マップ<ストリング> String> FilterChainDefinitionMap = New LinkedHasmap <String、String> String> FilterChainDefinitionMap.put(casfilterurlpattern、 "casfilter"); // 2。 FilterChainDefinitionMap.put( "/css/**"、 "anon")をインターセプトしないリクエスト。 FilterChainDefinitionMap.put( "/js/**"、 "anon"); FilterChainDefinitionMap.put( "/login"、 "anon"); //ここで、ログアウトはログアウトではなくAnonにログアウトページを設定します。ログアウトは単一のポイントで処理され、ShiroのLogoutFilter FilterChainDefinitionMap.put( "/logout"、 "anon")で傍受する必要はありません。 FilterChainDefinitionMap.put( "/error"、 "anon"); // 3。インターセプトされたリクエスト(ローカルデータベースまたはキャッサーバー(Webサービス、httpなどのリモートメソッド)から取得し、役割許可が設定されている場所を参照)filterchaindefinitionmap.put( "/user"、 "authc")); //必要なログイン// 4。ログインは、FilterChainDefinitionMap.put( "/**"、 "authc")をインターセプトしません。 shirofilterfactorybean.setFilterChainDefinitionMap(FilterChainDefinitionMap); }}一部の構成参照:http://shiro.apache.org/spring.html
3。領域を書く
シングルサインオンの関数を統合する必要があるため、CasrealMクラスを統合する必要があります。このクラスは、単一ポイント認証の関数を実装しています。私たちがする必要があるのは、承認部分の機能を実装することです。例コードは次のとおりです。
パッケージcom.chhliu.springboot.shiro.config; javax.annotation.resourceをインポートします。 Import org.apache.shiro.securityutils; org.apache.shiro.authc.authenticationinfoをインポートします。 org.apache.shiro.authc.authenticationtokenをインポートします。 org.apache.shiro.authz.authenticationinfoをインポートします。 org.apache.shiro.authz.simplauthorizationinfoをインポートします。 Import org.apache.shiro.cas.casrealm; org.apache.shiro.subject.principalcollectionをインポートします。 com.chhliu.springboot.shiro.mode.syspermissionをインポートします。 com.chhliu.springboot.shiro.mode.syspermissionをインポートします。 com.chhliu.springboot.shiro.mode.userinfo; com.chhliu.springboot.shiro.service.userinfoserviceをインポートします。 /***許可確認コアクラス。シングルサインオンが使用されるため、認証する必要はありません。承認だけが必要です * * @author chhliu */ public class myshirorealmはcasrealm {@resource private userinfoservice userinfoserviceを拡張します。 / ***1。CAS認証、ユーザーIDの検証*2。ユーザーの基本情報をセッションに設定して簡単にアクセスできるようにします* 3。 Casrealmは、私たちのために単一の認証ポイントを実装しています。 AuthenticationInfo authc = super.dogetauthenticationinfo(token); //ログインアカウントを取得します。 CAS認証が成功した後、アカウントは保存されます。 stringアカウント=(string)authc.getPrincipals()。getPrimaryPrincipal(); //ユーザー情報をセッションに保存して、プログラムを簡単に取得することができます。ここで、ログインアカウントに基づいてクエリのユーザー情報をセッションSecurityUtils.getSubject()。getSession()。 authcを返します。 } /***コールバックは、このメソッドがhasroleとhaspermissionを呼び出す場合にのみ実行されます。 * *許可情報。 (承認):1。ユーザーが正常に終了する場合、キャッシュは自動的にクリアされます。 2。ユーザーが異常に終了すると、キャッシュが自動的にクリアされます。 * 3。ユーザーの権限を変更しているが、ユーザーがシステムからログアウトしない場合、変更されたアクセス許可はすぐに有効になりません。 (手動で実装する必要があります。通話のために使用する必要があります) *許可が変更された後、領域の方法が呼び出されます。レルムは春までに管理されているため、領域インスタンスは春から取得され、明確な方法が呼び出されます。 *:承認は、ユーザーが実行する操作を承認するために使用される許可アクセス制御であり、特定のリンク、特定のリソースファイルなどのアクセスなど、ユーザーが現在の操作を許可するかどうかを証明します。 configuration-> myshirorealm.dogetauthorizationinfo() "); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); //単一のサインイン後にユーザー名を取得すると、認証が成功した後、セッション文字列ユーザー名=(文字列)super.getAvailablePrincipal(校長)にユーザー名が入力されたため、セッションから取得することもできます。 // Principals.getPrimaryPrincipal();このメソッドは、ユーザー名を取得することもできます//ユーザー名に基づいてユーザーの役割と許可情報を取得するユーザーuserinfo userinfo = userinfoservice.findbyusername(username); //ユーザーの対応する役割と許可情報を承認infoにパッケージ化する(sysroleロール:userinfo.getrolelist()){autherizationinfo.addrole(role.getrole()); for(syspermission p:role.getpermissions()){authisizationinfo.addstringpermission(p.getpermission()); }} authorizationinfoを返します。 }}次に、検証テストを実施できます!
http:127.0.1.28:8080/userinfo/userlistをブラウザに入力すると、シングルポイントログインページに自動的にジャンプすることがわかります
次に、ユーザー名とパスワードを入力すると、HTTP:127.0.1.28:8080/userInfo/userlistページに自動的にジャンプします。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。