Javaセキュリティフレームワーク-Shiro

12057 ワード

Shiro使用:
 1、Apache ShiroはJavaのセキュリティ(権限)フレームワークです. 2、Shiroは簡単に完成できる:身分認証、授権、暗号化、セッション管理などの機能. 3、ShiroはJavaSE環境だけでなく、JavaEE環境でも使える十分なアプリケーションを簡単に開発することができます. 4、機能が強くて使いやすくて、どんなアプリケーション(最小のモバイルアプリケーションから最大のWebと企業のアプリケーションまで)も素早く簡単に保護できる.便利にWebとキャッシュを集積して構築する.
 一、機能:
• Authentication     アイデンティティ認証/ログイン、ユーザーが相応のアイデンティティを持っているかどうかを検証する.
• Authorization     認証、すなわち、認証済みのユーザーが権限を持っているかどうかを検証する権限検証、すなわち、ユーザーがどのような操作を行うことができるかどうかを判断する権限検証    たとえば、ユーザーがロールを持っているかどうかを確認します.または、リソースに対するユーザーの権限があるかどうかを確認します.
• Session Manager     セッション管理、つまりユーザーがログインした後に1回のセッションであり、終了する前にそのすべて    情報はすべてセッションの中にあります;セッションは普通のJavaSE環境であることができて、Web環境であることができます;
• Cryptography     暗号化、データの安全性を保護し、例えば暗号化してデータベースに格納し、明文記憶ではない.
• Web Support     Webサポートは、Web環境に非常に容易に統合できます.
• Caching     キャッシュ、例えばユーザーがログインした後、そのユーザー情報、所有するロール/権限は毎回調べる必要がなく、効率を高めることができる.
• Remember Me     私を覚えておいてください.これはよくある機能です.つまり、一度ログインしてから、今度また来たら、あなたがどのユーザーなのかすぐに知ることができます.
二、Shiroアーキテクチャ
 
一、仕事の流れ.
   shiro実行プロセスでは、3つのコアコンポーネント:  Subject、SecutiryManager、Realm。• Subject
     , " ?" " x ?",
    。Subject “ ”,
    Subject, Subject shiro 。
    Shiro API Subject。
    Subject SecurityManager。
    ==Subject ==
• SecurityManager
     ; SecurityManager ;
     Subject; Shiro ,
     Shiro , SpringMVC DispatcherServlet
• Realm
    Shiro Realm ( 、 、 ), SecurityManager ,  
     Realm ;
     Realm / ;
     Realm DAO,( )
  、 RBACモデル
    ロールベースアクセス制御.
• Subject     アプリケーションと対話できる任意の「ユーザー」. 
• SecurityManager      SpringMVCのDispatcherServiceletに相当し、Shiroの心臓である.    すべての具体的なインタラクションはSecurityManagerによって制御されます.すべてのSubjectを管理し、認証、認可、セッション、および    キャッシュの管理. 
• Authenticator     Subjectのアイデンティティの認証を担当して、1つの拡張点で、カスタマイズして実現することができます;認証を使うことができます    ポリシー(Authentication Strategy)は、どのような場合にユーザ認証が通過したかを計算します. 
• Authorizer     授権器、すなわちアクセスコントローラは、主体が相応の操作を行う権限があるかどうかを決定するために使用される.すなわち、ユーザーがアプリケーションのどの機能にアクセスできるかを制御する. 
• Realm     1つまたは複数のRealmがあり、セキュリティエンティティのデータ・ソース、すなわちセキュリティエンティティの取得に使用されると考えられる    の;JDBCの実現であることができて、メモリの実現などであることができます;ユーザーが提供します;だから一般的に応用の中ですべて必要です    自分のRealmを実現する. 
• SessionManager     セッションのライフサイクルを管理するコンポーネントですが、ShiroはWeb環境だけでなく、一般的なJavaSE環境でも使用できます. 
• CacheManager     ユーザ、ロール、パーミッションなどのキャッシュを管理するキャッシュコントローラ.これらのデータは基本的にほとんど変化しないため、    キャッシュに入れるとアクセスのパフォーマンスが向上 
• Cryptography     パスワードモジュール、Shiroは、パスワードの暗号化/復号化などの一般的な暗号化コンポーネントを提供します.
 
三、使用過程.(Springと 統合)
一、導入依存



    org.apache.shiro
    shiro-spring
    1.4.0

 
二、web.xmlの構成

    
    
        shiroFilter
        org.springframework.web.filter.DelegatingFilterProxy
        
            targetFilterLifecycle
            true
        
    
    
        shiroFilter
        /*
    

三、カスタムRealm.
     カスタムrealmには、次の2つの親が選択できます.
1、 realmがアイデンティティ認証のみを担当している場合は、AuthenticatingRealmを継承できます.
2.realmが認証と権限検証を担当する場合、継承可能:AuthorizingRealm
 
package com.vince.realm;

import com.vince.pojo.User;
import com.vince.service.PermissionService;
import com.vince.service.RoleService;
import com.vince.service.UserService;
import lombok.Setter;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

import java.util.Set;


@Setter
public class MyRealm extends AuthorizingRealm {

          private UserService userService;
          private RoleService roleService;
          private PermissionService permissionService;


    /**
     *   :      ,     ,      
     *     :  /user/query = roles["admin"]  /user/insert= perms["user:insert"]    role = roleService.queryAllRoleByUsername(username); //       
        Set permisson = permissionService.querypermissionByUsername(username);//       
        //       

        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(role);
        simpleAuthorizationInfo.setStringPermissions(permisson);
        return simpleAuthorizationInfo;
    }




    /**
     *   :      ,     ,      
     *     :           。
     *     :subject.login(token);
     * @param token
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
       //             
        String  username =(String) token.getPrincipal();
       //  UserService userService = ContextLoader.getCurrentWebApplicationContext().getBean("userServiceImpl", UserService.class);
        //       
        User user = userService.findUserByUsername(username);
        if (user==null){    //       
            return null;    //          UnknownAccountException
        }

       //          AuthenticationInfo  

        return  new SimpleAuthenticationInfo(user.getUsername(),   //        
                                              user.getPassword(),  //       
                           ByteSource.Util.bytes(user.getSalt()),  //  
                                               this.getName());    // realm   

    }
}

 
プロファイル:
  shiro-spring.xml:






    
    
    
    
    
        
        
        
         
        
        
        
        
        
        
        
        
    

  




    
    
        
       

        
        

    




    
    
        
        
        
        
            
                
                
                
                /user/logout = logout
            
        
    


 

Springファクトリにこのファイルをインポートし、Shiroの構成を完了します.
 
三、springMVCのcontrollerで、要求を送り、shiroを検証する
package com.vince.controller;


import com.vince.pojo.User;
import com.vince.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
  //  @RequiresAuthentication                 
public class ShiroController {

    @Autowired
    private UserService userService;

    @RequestMapping("/login/page")
    public String loginpage(){
        System.out.println("goto login");
        return "login";
    }


    @RequestMapping("login")
    public String login(String username,String password){
        System.out.println(username+"....."+password);

        Subject subject = SecurityUtils.getSubject();
        //      
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);
        //    
        token.setRememberMe(true);
         subject.login(token);
           return "index";
    }

     @PostMapping("/regist")
    public String regist(User user){
         Integer ints = userService.insert(user);
         return "registSuccess";

    }


    @RequiresAuthentication
    @RequiresRoles(value = {"student","teacher"},logical = Logical.OR)   //      
    @RequestMapping("/query")
    public String queryAll(){
        System.out.println("    ~");
        return "hallo";
    }

    @RequiresAuthentication
    @RequestMapping("/delete")
    @RequiresPermissions({"delete"})  //     ,          " "
    public String deleteAll(){
        System.out.println("    ~");
        return "delete";
    }

    @RequestMapping("/error")
    public String Nopermit(){
        return "error";
    }

}

このようにして、アイデンティティと権限の検証を完了できます.