ヒント:記事の作成後、目次を自動的に生成できます。生成方法については、右側のヘルプドキュメントを参照してください
記事ディレクトリ
序文
ここでは、私の最近の学習体験についてお話します。オープンソースプロジェクトに携わっていたとき、すでにいくつかの基本的な知識を保存していて、いくつかのフレームワークの使用方法を知っていました。この時点でコードを見ると、実行の順序や、このように構成されている理由など、多くの疑問が生じます。現時点では、ctrl + bを続けて、レイヤーごとに調べていきます。見れば見るほど、疑わしくなります。本当にやりますか? ?おそらく私はあなたにその原則や何かを得るためにあなたに言うためにここにいません、私はあなたに学習のネガティブな情報を伝えて欲しいです。初心者の方は、フレームワークを学習するときに明確な理解が必要です。フレームワークはカプセル化する必要があります。次に、フレームワークで何をしますか?使えれば理解できるので、最初から深く勉強する必要はありません。
1. xmallでshiroを使用する方法
前回の記事では、xmall-ssoのシングルサインオン機能を確認しましたが、内部のコードは非常にシンプルであることがわかりました。つまり、データベースにアクセスしてクエリと検証を行い、トークンを生成して、redisに入れました。トークンに基づいてユーザーデータを取得するメソッドも記述しました。それで、サービスが呼び出されるたびに、ログインステータスと権限を手動で確認する必要がありますか?検証のために各要求が手動で記述されているか、検証を達成するためにAOPが使用されているかに関係なく。すべて自分で実現する必要があります。1つは、プロジェクトの複雑さと難易度を上げることです。また、エラーが発生しやすくなります。
xmall-front-webは使用されていないことがわかりますが、shiroはxmall-manager-webで使用されています。次に、shiroフレームワークを使用してログインと権限の検証を行う方法を見てみましょう。
2、shiro検証
1.shiro配置
<!-- 配置自定义Realm -->
<bean id="myRealm" class="cn.exrick.manager.shiro.MyRealm"/>
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myRealm"/>
</bean>
<bean id="perms" class="cn.exrick.manager.shiro.MyPermissionFilter"/>
<!-- Shiro过滤器 核心-->
<bean id="shiroFilter" class="cn.exrick.manager.shiro.MyShiroFilterFactoryBean">
<!-- Shiro的核心安全接口,这个属性是必须的 -->
<property name="securityManager" ref="securityManager"/>
<!-- 身份认证失败,则跳转到登录页面的配置 -->
<property name="loginUrl" value="/login"/>
<!-- 登录成功之后的 跳转页面 -->
<property name="successUrl" value="/"/>
<!-- 权限认证失败,则跳转到指定页面 -->
<property name="unauthorizedUrl" value="/403"/>
<!--自定义过滤器-->
<property name="filters">
<util:map>
<entry key="perms" value-ref="perms"></entry>
<entry key="roles" value-ref="perms"></entry>
</util:map>
</property>
<!-- Shiro连接约束配置,即过滤链的定义 -->
<property name="filterChainDefinitions">
<value>
<!--anon 表示不需要认证以及授权-->
<!--authc 表示需要认证 没有登录是不能进行访问的-->
<!--perms 表示需要该权限才能访问的页面 /user/* = perms[/*] -->
<!--roles 表示需要角色才能访问的页面 /* = roles[管理员]-->
<!--/login = anon
/401 = anon
/ = authc
/index = authc
/welcome = authc
/thanks-pic = authc
/lock-screen = authc
/user/logout = authc
/user/userInfo = authc-->
</value>
</property>
</bean>
<!-- Shiro生命周期处理器 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
ここでは
、securityManagerセキュリティマネージャーを構成するためにいくつかの部分に分割できます。彼は、レルム
構成のカスタムレルム
構成のカスタムフィルターを挿入する必要がありますMyPermissionFilter
2.ログイン許可の確認
特定の実行プロセスを見てください
URLリクエストは最初にMyPermissionFilterによってインターセプトされます
。このクラスにはisAccessAllowedメソッドが1つだけあります。これはどのメソッドですか?
ctrl + bは、それがAccessControlFilterの抽象メソッドであることを見つけ、それを呼び出す場所を見つけました。ここで、メソッドonAccessDeniedを見てみましょう。このメソッドとisAccessAllowedの違いは、ログイン時に使用され、ログインに失敗したときに使用されることです。通常は401ページへのリダイレクトに使用されます。
内部を見ると、ようやくこのPathMatchingFilterでおなじみのコードが見つかりました
。preHandleメソッドは、プロセッサのインターセプトに使用されます。名前が示すように、このメソッドはコントローラ処理の前に呼び出されます。
フィルターとインターセプターが非常に類似していて、フィルターとインターセプターの違いに関する記事を推奨するかどうかを確認します。
イベントの後、コントローラである
SecurityUtilsに戻ります。これは、
サブジェクトであり、securityManagerによって管理される
最後のsubject.login(トークン)であり、フレームワークのログイン許可検証などを呼び出します。
総括する
Dangdangが1つまたは2つのケースを検討しても包括的ではない場合、shiroにはまだ多くの知識があります。公式ドキュメントを読むことをお勧めします。後でJWTに復興プロジェクトに参加します