セキュリティはどこにでもあります。私は休日を利用してShiroの文書を読み、ShiroのSpring Bootの統合を文書化して、データベースの役割に基づいてアクセス権を制御します
導入
Apache Shiroは、強力で柔軟なオープンソースセキュリティフレームワークです。認証、承認、エンタープライズセッション管理、暗号化をきれいに処理します。
上の写真は、シロの基本的なアーキテクチャを示しています
認証
ユーザーがユーザー自身であることを証明するために「ログイン」と呼ばれることもあります
許可
アクセス制御のプロセス、つまり、「誰が」に「誰が」にアクセスするかを決定します
セッション管理
ユーザー固有のセッションを管理します。 Shiroでは、すべてのユーザーセッション情報がShiroによって制御されることがわかります。
暗号化(暗号化)
使いやすさを確保しながら、データソースの暗号化アルゴリズム
始める
環境
スプリングブート1.5.9 mysql 5.7 maven 3.5.2 spring data jpa lombok
依存関係を追加します
ここでは、主要なシロ依存関係のみが与えられます
<Dependency> groupId> org.apache.shiro </groupid> <artifactid> shiro-spring-boot-starter </artifactid> <バージョン> 1.4.0-rc2 </version> </dependency>
構成
当面はユーザーテーブルとロールテーブルのみが必要です。 Spring Bootで構成ファイルを変更すると、自動的にデータベーステーブルが作成されます
サーバー:ポート:8888SPRING:DataSource:Driver-Class-Name:com.mysql.jdbc.Driverユーザー名:ルートパスワード:ルートURL:JDBC:MySQL:// localhost:3306/shiro?charatereCoding = utf-8&usessl = fals jpa:generate-ddl:dddl:dddl-ddl-
実在物
role.java
@data @entitypublicクラスの役割{@id @generatedValue private integer id;プライベートロングユーザーID;プライベートストリングロール;}user.java
@data @entitypublic classユーザー{@id @generatedValueプライベートLong ID;プライベート文字列ユーザー名;プライベート文字列パスワード;}領域
まず、Realmクラスを作成し、承認を承認することから継承し、独自の承認と認証方法をカスタマイズします。 Realmは、ユーザー、役割、権限など、アプリケーションに固有のセキュリティデータにアクセスできるコンポーネントです。
realm.java
Public Class Realmは、AuthorizingRealm {@Autowired Private Userservice Userserviceを拡張します。 // authisize @override Protected AuthorizationInfo dogetauthorizationinfo(spinitalCollection principalCollection){//資格情報からusernameを取得するstring username =(string)securityutils.getSubject()。getPrincipal(); //ユーザー名に基づくユーザーオブジェクトユーザー= userservice.getuserbyUsername(username); //ユーザーリストが所有するロールをクエリ<lole> list = rowservice.findbyuserid(user.getId()); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for(役割の役割:list){//ユーザーの役割info.addstringpermission(role.getrole()); }情報を返します。 } // @Override Protected AuthenticationInfo dogetAuthenticationInfo(AuthenticationToken AuthenticationToken)Sthrows EuthenticationException {//現在のユーザー文字列username =(string)authenticationToken.getPrincipal(); //データベースからユーザーの検索ユーザー= userservice.getuserbyUsername(username); if(userservice.getuserbyUsername(username)== null){新しいundounceccountexception( "対応するユーザー情報はこのシステムでは見つかりませんでした。"); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getUsername()、user.getPassWord()、getName());情報を返す; }}Shiro Configurationクラス
shiroconfig.java
@configurationpublic class shiroconfig {@bean public shirofilterfactorybean shirofilterfactorybean(securitymanager securitymanager){shirofilterfactorybean shirofilterfactorybean = new shirofilterfactorybean(); shirofilterfactorybean.setsecuritymanager(securitymanager); map <string、string> filterchaindefinitionMap = new linkedhashmap <string、string>(); //次のものはフィルターチェーンで、順番にフィルタリングされるため、/**最後の静的リソースを配置する必要があります// Open FilterChainDefinitionMap.put( "/favicon.ico"、 "anon"); // webアイコンfilterchaindefinitionmap.put( "/**"、 "authc"); shirofilterfactorybean.setFilterChainDefinitionMap(FilterChainDefinitionMap); shirofilterfactorybeanを返します。 } @bean public defaultwebsecuritymanager securitymanager(){defaultwebsecuritymanager defaultwebsecuritymanager = new defaultwebsecuritymanager(myrealm()); DefaultWebseCurityManagerを返します。 } @bean public myrealm myrealm(){myrealm myrealm = new myrealm(); myrealmを返します。 }}コントローラ
usercontroller.java
@controllerpublic class usercontroller {@autowired private userservice userservice; @getMapping( "/")public string index(){return "index"; } @getMapping( "/login")public string tologin(){return "login"; } @getMapping( "/admin")public string admin(){return "admin"; } @postmapping( "/login")public string dologin(string username、string password){usernamepasswordtokenトークン= new usernamepasswordtoken(username、password);件名= securityutils.getSubject(); try {subject.login(token); } catch(Exception e){e.printstacktrace(); } "redirect:admin"を返します。 } @getMapping( "/home")public string home(){subject = securityutils.getSubject(); try {subject.checkpermission( "admin"); } catch(UnauthorizedException Exception){system.out.println( "十分な権限なし"); } "home"を返します。 } @getMapping( "/logout")public string logout(){return "index"; }}サービス
userservice.java
@servicepublic class userservice {@autowired private userdao userdao;パブリックユーザーgetUserbyUsername(string username){return userdao.findbyusername(username); } @RequiresRoles( "admin")public void send(){system.out.println( "役割管理者があり、このステートメントを実行できます"); }}表示レイヤー
admin.html
<!doctype html> <html xmlns:th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title>タイトル>タイトル>タイトル</タイトル> </head> < /> <入力タイプ= "パスワード" name = "password" /> <input type = "submit" value = "login" /> < /form> < /body> < /html>
home.html
<!doctype html> <html xmlns:th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title> title> title </title> </head> </html> </html
index.html
<!doctype html> <html xmlns:th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title>タイトル>タイトル> </head> <body </a> </body> </html>
login.html
<!doctype html> <html xmlns:th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title>タイトル>タイトル>タイトル</タイトル> </head> < /> <入力タイプ= "パスワード" name = "password" /> <input type = "submit" value = "login" /> < /form> < /body> < /html>
要約します
この小さなケースは、役割に基づいてユーザーアクセスの制御を実装します。その中で最も重要なのは、シロとアプリケーションセキュリティデータの間の「ブリッジ」または「コネクタ」として機能する領域です。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。