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 アプリケーションと対話できる任意の「ユーザー」.
• 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と 統合)
一、導入依存
二、web.xmlの構成
三、カスタムRealm.
カスタムrealmには、次の2つの親が選択できます.
1、 realmがアイデンティティ認証のみを担当している場合は、AuthenticatingRealmを継承できます.
2.realmが認証と権限検証を担当する場合、継承可能:AuthorizingRealm
プロファイル:
shiro-spring.xml:
Springファクトリにこのファイルをインポートし、Shiroの構成を完了します.
三、springMVCのcontrollerで、要求を送り、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";
}
}
このようにして、アイデンティティと権限の検証を完了できます.