Apphe Shroの簡単な使用

12886 ワード

Apphe Shroの簡単な理解
  • は、javaにおいて権限制御機能を行い、主に粗粒度(URLレベルの権限に基づいて制御する)と細粒度(方法レベルの権限に基づいて制御する)の2つに分けられる.主に使うフレームはSpring SecurityとApachhe Shroが一般的で、前者は複雑で、springに依存しています.後者はもっと軽い量を使って、もっと簡単で、springに完全に依存しないで、単独で
  • を使うことができます.
  • 粗粒度権限制御(URLレベル権限による制御)
  • 粗粒度権限制御は、一般に、主としてFileterフィルタに基づいて実行される
  • である.
  • は、一般的に、少なくとも5つのテーブルが必要です.すなわち、ユーザーテーブル、パーミッションテーブル(Permission)、キャラクターテーブル(Role)、ユーザーとキャラクターの関連表、キャラクターとパーミッションの関連表です.
  • Menuテーブルを追加する必要がある場合、メニューを追加し、異なるユーザに対して異なるメニュー管理を表示しやすく、Menuテーブルを構成する場合は、さらに、役割とメニュー関連テーブル
  • を設定する必要がある.
  • Apphe Shroを使って権限制御を行う.
  • Aache Shroシステム構造は6つの部分があります.
  • Authentication認証-ユーザ登録
  • Authortization授権—ユーザーはどのような権限を持っていますか?
  • Cryptgraphyセキュリティデータ暗号化
  • セッション管理
  • Web Integration webシステム統合
  • Integrationsは、他のアプリケーションを統合し、spring、キャッシュフレーム
  • mavenを用いて管理し、対応する依存jarパケットを導入する
  • .
    <dependency>
        <groupId>org.apache.shirogroupId>                                     
        <artifactId>shiro-allartifactId>
        <version>1.3.2version>
    dependency>
    
  • Shroを使用した権限制御は、4つの主要な方法があります.
  • プログラムにおいて、Subjectプログラムによる権限制御
  • を行う.
  • Filterを構成し、URLレベルの粗粒度権限制御を実現する
  • .
  • は、プロキシを構成し、注釈に基づいて、微細度権限制御
  • を実現する.
  • ページにshiroカスタムラベルを使用してページ表示権限制御
  • を実現する.
    ユーザ登録機能は、Aache Shroを使用して実現される(URL粗粒度レベルを使用する).
    第一歩:設定web.xml
     
    <filter>
         <filter-name>shiroFilterfilter-name>
         <filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
    filter>
    <filter-mapping>
         <filter-name>shiroFilterfilter-name>
         <url-pattern>/*url-pattern>
    filter-mapping>
    
    第二ステップ:appication Contact.xmlを配置し、関連する名前空間を導入する.
    
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
    
    ステップ3:配置に関するbean
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">    
         
         <property name="securityManager" ref="securityManager">property>
         
         <property name="loginUrl" value="/login.html">property>
         
         <property name="successUrl" value="/index.html">property>
         
         <property name="unauthorizedUrl" value="/unauthorized.html">property>
         
         <property name="filterChainDefinitions">
              <value>
                   /login.html* = anon       
                   /css/** = anon
                   /js/** = anon
                   /images/** = anon
                   /validatecode.jsp = anon     
                   /user_login.action* = anon     
                   /** = authc
              value>
         property>
    bean>
    
    第四ステップ:struts 2を使ってフロントから転送されたデータを受信する
    @Controller
    @ParentPackage("json-default")
    @Namespace("/")
    @Scope("prototype")
    public class UserAction extends BaseAction<User> {
    
         //                User      ,              
    
         private static final long serialVersionUID = -6905277651888140750L;
    
         @Action(value = "user_login", results = { @Result(name = "success", type = "redirect", location = "./index.html"),
              @Result(name = "login", type = "redirect", location = "./login.html")})
         //         
         public String login() {
              //  shiro      ,  subject
              Subject subject = SecurityUtils.getSubject();
              //               
              AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),model.getPassword());
    
              try {
                   subject.login(token);
                   //    
                   return SUCCESS;
              } catch (AuthenticationException e) {
                   e.printStackTrace();
                   //    ,       
                   return LOGIN;
              }
         }
    }
    
    ステップ5:Realmオブジェクトを作成し、本物の登録認証を実現する(開発中はAuthorigingRealmを直接継承するのが一般的です).
    @Service("bosRealm")
    public class BosRealm extends AuthorizingRealm {
    
         @Autowired
         private UserService userService;
    
         @Override
         protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    
              System.out.println("shiro     ......");
    
              UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
              //            
              User user = userService.findByUsername(usernamePasswordToken.getUsername());
    
              if (user == null) {
                   //       ,     
                   return null;
              } else {
                   //       
                   //       ,securityManager                        ,       ,       
                   return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
              }
         }
    }
    
    第六ステップ:service層とdao層を書いて、安全管理器を配置する.
    
      <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
           <property name="realm" ref="bosRealm">property>     
      bean>
    
      <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor">bean>
    
    これにより、ユーザー登録権限ブロックが簡単に実現され、ユーザーが存在しない場合、org.apacthe.shiro.authc.UniknownAccent Exception異常を報告します.ユーザー名のパスワードが間違ったら、org.apache.auth.IncorectCredentialsException異常を報告します.