シロ
ShiroはApacheの下のオープンソースプロジェクトです。ApacheShiroと呼んでいます。これは、Javaプロジェクトを備えた非常に使いやすいセキュリティフレームワークであり、認証、承認、暗号化、およびセッション管理を提供します。 Spring Securityのように、それは許可セキュリティフレームワークです。ただし、Spring Securityと比較して、Shiroは比較的シンプルで、理解しやすく、使いやすい許可方法を使用しています。シロは軽量のフレームワークです。セキュリティよりもはるかに簡単で、セキュリティほど複雑ではありません。より詳細な紹介については、基本的にその公式Webサイト(http://shiro.apache.org/)から学ぶことができます。主に次の機能を提供しています。
(1)認証(認証)
(2)承認(承認)
(3)セッション管理(セッション管理)
(4)暗号化(暗号化)
まず第一に、認証サービス、つまり彼女を通して、あなたはID認証を完了し、ユーザーが実際のメンバーであるかどうかを判断できるようにすることができます。
第二に、承認されたサービスは、それを率直に言うために、「アクセス制御」サービスです。つまり、ユーザーが持っている権限を識別させます。率直に言って、ユーザーがどのような役割を判断することにより、どのような操作許可を与えますか。
次に、セッション管理サービスがあります。現時点では、独立したセッション管理フレームワークは、よく知っているHTTPセッションとは異なります。
最後に、彼女はまた、暗号化(暗号化)サービスを提供し、多くの暗号化アルゴリズムをカプセル化します。
今日、私はそれについてすべてを言うわけではなく、彼女の会話管理機能に焦点を合わせます。実際、これはほとんどすべてのウェブが関与すべきものです。
Shiroのセッション管理サービスについて話す前に、以前のセッション管理をどのように行ったかを確認しましょう。
1。最初は、WebサーバーのHTTPセッションメカニズムを直接使用しました。つまり、ユーザーが初めて入った場合、Webコンテナがリクエストのセッションを作成し、セッションを保存します。 Cookieとして対応するSessionIDをクライアントに渡すことにより。
クライアントが再びこのサーバーにリクエストを送信した場合、SessionIDは自動的に持ち込まれます。次に、Webサーバーは、クライアントが提起したSessionIDに基づいてセッションがまだメモリにあるかどうかを判断します(セッションには有効期限があり、Web.xmlファイルで構成できます)。対応するセッションが見つからない場合、セッションの有効期限が経過したことを意味します。この時点で、Webサーバーは再びセッションを作成し、以前のように新しいSessionIDをクライアントに渡します。
したがって、このメカニズムを使用して、プログラムでユーザーのログインセッションを管理できます。たとえば、ユーザーの最初のログインが成功した後、セッションにユーザーの基本情報を保存します(たとえば: session.setAttribute("user", "userInfo") )。次回ユーザーが再び訪問するとき、ユーザー情報に基づいて現在のセッションでユーザー情報を取得します
( session.getAttribute("user") )ユーザーの有効期限が切れたかどうかを判断します。取得できない場合、ユーザーは再度ログインするように求められます。
2。2番目の方法は、情報がキャッシュ、Memecache、Redisなどのサードパーティメディアに情報が保存される場所を転送することです。この方法は、分散システムの出現により、主に採用されています。
この場合、セッションを自分で生成する必要があります。一般に、定義済みのプレフィックス( user:login:token )を使用し、useridまたはタイムスタンプを追加します。次に、このセッションIDをキャッシュキーとして使用し、ユーザーの情報を値として使用し、キャッシュに保存し、無効な時間を設定します。
jedisclient.set(tokenkey、jsonutil.tojsonstring(userinfo)); jedisclient.expire(tokenkey、token_lose_seconds);
また、Cookie: CookieUtils.setCookie(request, response, "TT_TOKEN", tokenKey);
このようにして、ユーザーが次回(インターセプターを定義する)にアクセスすると、Cookieから対応するTokenkeyを取り出し、このtokenKeyを使用してキャッシュに移動して対応する値を取得できます。取得できない場合、キーが期限切れになり、ユーザーが再度ログインするように求められていることを意味します。
注: TokenKeyは重要です。これは、キャッシュ側とクライアントを接続するハブです。
3.最後のものは私たちのシロ法であり、アイデアは似ています。コードは非常に簡単なので、コードをアップロードします。
1)新しいApplicationContext-Shiro.xmlファイルを作成します。
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:context = "http://www.springframework.org/schema/context" xmlns:p = "http://www.springframework.org/schema/p" xmlns:aop = "http://www.springframework.org/schema/tx" xmlns:xsi = "http://www.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w. xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/spring-4.0。 id = "Shirofilter"> <プロパティ名= "SecurityManager" Ref = "SecurityManager"> </Property name> <Property name = "loginurl" value = "/loginpage"> </property name> <property name = "unauthorizeurl" value = "/pages/pages/unauthorized.jsp"/> = anon </value> </property> </bean> <bean> <property name = "staticmethod" value = "org.apache.shiro.securitymanager"> </property> <財産> <jumpution "ref =" securitymanager "> </property> </bean> <bean id =" securitymanager "> < ref = "cachemanager"> </property> <プロパティ名= "sessionmanager" ref = "sessionmanager"> </property> </bean> <bean id = "sessionmanager"> <プロパティ名= "sessiondao" ref = "sessiondao"> </bean> //
2)web.xmlで対応するフィルターを構成します:
<filter> <filter-name> shirofilter </filter-name> <filter-class> org.springframework.web.filter.delegatingfilterproxy </filter-class> <init-param> <param> <param> <param> <param> <param> <param-> <param-value> <filter-name> shirofilter </filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3)実装クラスを作成し、AbstractSessionDaoを継承し、対応する方法を実装します。
パッケージcom.jdd.core.shiro; import com.smart.core.redis.redismanager; Import org.apache.shiro.session.session; Import org.apache.shiro.session.unknownsesscection; Import org.apache.shiro.session.mgt.eis.abstrattstractsessiondao; Import; springframework.beans.factory.annotation.autowired; import org.springframework.util.serializationutils; Import java.util.arraylist; Import java.util.celection; @Override public void Update(セッションセッション)unknownSessionException {redismanager.set(serializationutils.serialize(session.getId()。toString())、serializationutils.serialize(session)); redismanager.expire(serializationutils.serialize(session.getId()。toString())、60); } @Override public void delete(session session){redismanager.del(serializationutils.serialize(session.getid()。toString())); } @override public collection <session> getActivesessions(){return new arraylist <session>(); } @Override Protected Serializable Docreate(セッションセッション){//これは、最初にアクセスするとき、SessionID Serializable Sid = this.GenerateSessionId(session); assightsessionid(session、sid); redismanager.set(serializationutils.serialize(session.getId()。toString())、serializationutils.serialize(session)); redismanager.expire(serializationutils.serialize(session.getId()。toString())、60); sidを返します。 } @Override Protected Session DoreadSession(Serializable Serializable){//この方法は、実際にSessionIDを通じてセッションを読むことです。読み取るたびに、故障時間をリセットする必要があります[] aa = redismanager.get(serializationutils.serialize(serializable.tostring());セッションセッション=(セッション)serializationutils.deserialize(aa); redismanager.set(serializationutils.serialize(serializable.tostring())、serializationutils.serialize(session)); redismanager.expire(serializationutils.serialize(serializable.tostring())、60);返信セッション。 }}4)次のステップは、ログインに成功した後、Shiroのセッションをロジックで取得し、ユーザー情報をに設定することです。
package com.smart.controller;import com.smart.pojo.User;import com.smart.service.UserService;import org.apache.shiro.SecurityUtils;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.subject.Subject;import org.slf4j.Logger;import org.slf4j.loggerfactory; Import org.springframework.beans.factory.annotation.autowired; import org.springframework.tringframe.controller; import org.springframework.ui.model; Import org.springframework.web.notation javax.servlet.http.httpservletrequest; Import javax.servlet.http.httpservletResponse;@controller@requestmapping( "/user")public class usercontroller {@autowired private userservice userservice; @Autowired Private SecurityManager SM; // SecurityManagerプライベートロガーロガー= loggerFactory.getLogger(usercontroller.class); @RequestMapping(value = "/loginpage")public string loginpage(){return "user/userlogin"; } @RequestMapping(value = "/userlogin"、method = requestmethod.post)public string userlogin( @requestparam(value = "name")string name、@requestparam(value = "pwd")string pwd、model model){logger.info( "Enter userlogin ..."); user user = userservice.getuserbynameandpassword(name、pwd); if(user == null){logger.info( "ユーザーは存在しません..."); Model.Addattribute( "login_error"、 "ユーザー名またはパスワードエラー"); 「user/userlogin」を返します。 } securityutils.setsecuritymanager(sm);件名currentuser = securityutils.getSubject(); currentuser.getSession()。setAttribute( "login_user"、user); "redirect:/employee/list"を返します。 }}現在のユーザーを入手してください。シロでは、テーマであり、対応するセッションを取得し、ユーザー情報を設定します。 HTTPセッションの操作に少し似ていますか?ハハ。
5)最後に、SpringMVCインターセプターを定義して、インターセプターの対応するセッションでユーザー情報を取得します。取得できない場合、ログインインターフェイスにジャンプします。
パッケージcom.smart.core.shiro; import com.smart.pojo.user; Import org.apache.shiro.securityutils; Import org.apache.shiro.mgt.securitymanager; Import org.apache.shiro.subject.subject.subject; log.logger; org.springframework.beans.factory.annotation.autowired; Import org.springframework.web.servlet.handlerInterceptor; Import org.springframework.web.servlet.modelandview; Import javax.servlet.http.httprequest; Import; javax.servlet.http.httpservletResponse; public class loginInterceptor実装HandlerInterceptor {private logger logger = loggerfactory.getLogger(loginInterceptor.class); @Autowired Private SecurityManager SM; @Override public boolean prehandle(httpservletrequest httpservletrequest、httpservletresponse httpservletresponse、object o)スロー{logger.info( "logininterceptor ..."); httpservletrequest request = httpservletrequest; httpservletResponse応答= httpservletResponse; logger.info( "request uri ===>"+request.getRequesturi()); //ログインページのリクエストの場合、傍受されません。そうしないと、(request.getRequesturi()。 } else {securityutils.setsecuritymanager(sm);件名currentuser = securityutils.getSubject();オブジェクトobj = culernuser.getSession()。getattribute( "login_user"); if(obj == null){respons.sendredirect( "http:// localhost:8080/user/loginpage"); falseを返します。 } else {user user =(user)obj; if(user == null || user.getName()== null){respons.sendredirect( "http:// localhost:8080/user/logpage"); falseを返します。 } else {return true; }}}} @Override public void posthandle(httpservletrequest、httpservletrequest、httpservletresponse、httpservletresponse、object o、modelandview modelandview) httpservletResponse、オブジェクトO、例外e)例外{}}をスローする基本的にここにあります。ホームページ情報に直接アクセスすると、ログインページに自動的にジャンプします。
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。