shiro認證策略,授權
阿新 • • 發佈:2018-11-20
有具體問題的可以參考之前的關於shiro的博文,關於shiro的博文均是一次工程的內容 !
認證策略:
修改認證策略: applicationContext.xml
<!-- 認證器 --> <bean id="autheniicator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator"> <property name="realms"> <list> <refbean="jdbcRealm"/> <ref bean="SecondRealm"/> </list> </property> <!-- 認證策略 --> <property name="authenticationStrategy"> <bean class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"></bean> </property></bean>
授權:
授權之前的小說明:
此時的訪問並沒有問題:
注:在做授權的時候需要在securityManager 中讀取realms
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="cacheManager" ref="cacheManager"/> <property name="authenticator" ref="autheniicator"></property> <property name="realms"> <list> <ref bean="jdbcRealm"/> <ref bean="SecondRealm"/> </list> </property> </bean>
程式碼開始 新建一個類
list.sjp頁面中
<body> list. <br> <a href="admin.jsp">TO Admin</a> <br> <a href="user.jsp">TO User</a> <br> <a href="shiro/logout">Logout</a> </body>
applicationContext.jsp
<!-- 配置那些頁面需要受保護,以及訪問這些頁面需要的的許可權 1)anon 可以被匿名訪問 2)authc 必須認證即登陸後才可以訪問的頁面 3).logout登出 4)roles 角色過濾器 --> <property name="filterChainDefinitions"> <value> /login.jsp = anon /shiro/login = anon /shiro/logout = logout /user.jsp = roles[user] /admin.jsp = roles[admin] # everything else requires authentication: /** = authc </value> </property>
此時點選訪問user.jsp/admin.jsp的超連結都會去沒有許可權訪問的頁面
授權流程:
需要實現AuthorizingRealm的.....public abstract class AuthorizingRealm extends AuthenticatingRealm implements Authorizer, Initializable, PermissionResolverAware, RolePermissionResolverAwareAuthorizingRealm繼承 AuthenticatingRealm,但是沒有實現 AuthenticatingRealm的 doGetAuthenticationInfo的方法 所以認證和授權只需要繼承 AuthorizingRealm就可以了,同時實現它的兩個抽象方法
public class ShiroReamlTest extends AuthorizingRealm{ //授權 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // TODO Auto-generated method stub return null; } //加密 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // TODO Auto-generated method stub return null; } }
授權需要繼承的類以及實現的方法
實現:
public class ShiroRealm extends AuthorizingRealm { @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { 。。。。。。。 } //授權 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { System.out.println(principals); //1.PrincipalCollection獲取登陸的使用者資訊 Object principal = principals.getPrimaryPrincipal(); System.out.println(principal); //2.利用登陸的使用者資訊獲取當前使用者角色的許可權 Set<String> roles = new HashSet<String>(); roles.add("user"); if("admin".equals(principal)){ roles.add("admin"); } //3.建立SimpleAuthorizationInfo,並且設定其reles屬性 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles); //4. return info; } }
此時的設定之後 是可以成功訪問的!