久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Apache Shiro 快速入門教程,,shiro 基礎(chǔ)教程

 DavidJin1111 2017-07-17

第一部分 什么是Apache Shiro



1、什么是 apache shiro :


Apache Shiro是一個功能強大且易于使用的Java安全框架,,提供了認證,,授權(quán),加密,,和會話管理

如同 Spring security 一樣都是是一個權(quán)限安全框架,,但是與Spring Security相比,在于他使用了和比較簡潔易懂的認證和授權(quán)方式,。



2,、Apache Shiro 的三大核心組件:


1、Subject :當前用戶的操作

2,、SecurityManager:用于管理所有的Subject

3,、Realms:用于進行權(quán)限信息的驗證


Subject:即當前用戶,在權(quán)限管理的應(yīng)用程序里往往需要知道誰能夠操作什么,,誰擁有操作該程序的權(quán)利,,shiro中則需要通過Subject來提供基礎(chǔ)的當前用戶信息,Subject 不僅僅代表某個用戶,,也可以是第三方進程、后臺帳戶(Daemon Account)或其他類似事物,。

SecurityManager:即所有Subject的管理者,,這是Shiro框架的核心組件,可以把他看做是一個Shiro框架的全局管理組件,,用于調(diào)度各種Shiro框架的服務(wù),。

Realms:Realms則是用戶的信息認證器和用戶的權(quán)限人證器,,我們需要自己來實現(xiàn)Realms來自定義的管理我們自己系統(tǒng)內(nèi)部的權(quán)限規(guī)則。



3,、Authentication 和 Authorization


在shiro的用戶權(quán)限認證過程中其通過兩個方法來實現(xiàn):

1,、Authentication:是驗證用戶身份的過程。

2,、Authorization:是授權(quán)訪問控制,,用于對用戶進行的操作進行人證授權(quán),證明該用戶是否允許進行當前操作,,如訪問某個鏈接,,某個資源文件等。




4,、其他組件:


除了以上幾個組件外,,Shiro還有幾個其他組件:

1、SessionManager :Shiro為任何應(yīng)用提供了一個會話編程范式,。

2,、CacheManager :對Shiro的其他組件提供緩存支持。 




5,、Shiro 完整架構(gòu)圖: 



圖片轉(zhuǎn)自:http://kdboy./blog/1154644



第二部分 Apache Shiro 整合Spring的Web程序構(gòu)建


1,、準備工具:


持久層框架:Hibernate4  這邊我使用了Hibernate來對數(shù)據(jù)持久層進行操作

控制顯示層框架:SpringMVC 這邊我使用了SpringMVC實際開發(fā)中也可以是其他框架

數(shù)據(jù)庫:MySql

準備好所需要的jar放到項目中。

 


2,、創(chuàng)建數(shù)據(jù)庫:



首先需要四張表,,分別為 user(用戶)、role(角色),、permission(權(quán)限),、userRole(用戶角色關(guān)系表)

這邊分別創(chuàng)建四張表的實體類,通過Hiberantehibernate.hbm2ddl.auto屬性的update 來自動生成數(shù)據(jù)表結(jié)構(gòu),。


/*** * 用戶表 * * @author Swinglife * */@Table(name = 't_user')@Entitypublic class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) Integer id; /** 用戶名 **/ String username; /** 密碼 **/ String password; /** 是否刪除 **/ Integer isDelete; /** 創(chuàng)建時間 **/ Date createDate; //多對多用戶權(quán)限表 @OneToMany(mappedBy = 'user',cascade=CascadeType.ALL) List userRoles;省略get set….}

/**** * 角色表 * * @author Swinglife * */@Entity@Table(name = 't_role')public class Role { @Id @GeneratedValue(strategy = GenerationType.AUTO) Integer id; /**角色名**/ String name; /**角色說明**/ String description;}

/**** * 權(quán)限表 * * @author Swinglife * */@Entity@Table(name = 't_permission')public class Permission { @Id @GeneratedValue(strategy = GenerationType.AUTO) Integer id; /**token**/ String token; /**資源url**/ String url; /**權(quán)限說明**/ String description; /**所屬角色編號**/ Integer roleId;}

/*** * 用戶角色表 * * @author Swinglife * */@Entity@Table(name = 't_user_role')public class UserRole { @Id @GeneratedValue(strategy = GenerationType.AUTO) Integer id; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = 'userId', unique = true) User user; @ManyToOne @JoinColumn(name = 'roleId', unique = true) Role role;}

3,、編寫操作用戶業(yè)務(wù)的Service:


@Servicepublic class AccountService { /**** * 通過用戶名獲取用戶對象 * * @param username * @return */ public User getUserByUserName(String username) { User user = (User) dao.findObjectByHQL('FROM User WHERE username = ?', new Object[] { username }); return user; } /*** * 通過用戶名獲取權(quán)限資源 * * @param username * @return */ public List getPermissionsByUserName(String username) { System.out.println('調(diào)用'); User user = getUserByUserName(username); if (user == null) { return null; } List list = new ArrayList(); // System.out.println(user.getUserRoles().get(0).get); for (UserRole userRole : user.getUserRoles()) { Role role = userRole.getRole(); List permissions = dao.findAllByHQL('FROM Permission WHERE roleId = ?', new Object[] { role.getId() }); for (Permission p : permissions) { list.add(p.getUrl()); } } return list; } // 公共的數(shù)據(jù)庫訪問接口 // 這里省略BaseDao dao的編寫 @Autowired private BaseDao dao;}



4、編寫shiro組件自定義Realm:


package org.swinglife.shiro;import java.util.List;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.authc.UsernamePasswordToken;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.swinglife.model.User;import org.swinglife.service.AccountService;/**** * 自定義Realm * * @author Swinglife * */public class MyShiroRealm extends AuthorizingRealm { /*** * 獲取授權(quán)信息 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) { //根據(jù)自己系統(tǒng)規(guī)則的需要編寫獲取授權(quán)信息,,這里為了快速入門只獲取了用戶對應(yīng)角色的資源url信息 String username = (String) pc.fromRealm(getName()).iterator().next(); if (username != null) { List pers = accountService.getPermissionsByUserName(username); if (pers != null && !pers.isEmpty()) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (String each : pers) { //將權(quán)限資源添加到用戶信息中 info.addStringPermission(each); } return info; } } return null; } /*** * 獲取認證信息 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken at) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) at; // 通過表單接收的用戶名 String username = token.getUsername(); if (username != null && !''.equals(username)) { User user = accountService.getUserByUserName(username); if (user != null) { return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); } } return null; } /**用戶的業(yè)務(wù)類**/ private AccountService accountService; public AccountService getAccountService() { return accountService; } public void setAccountService(AccountService accountService) { this.accountService = accountService; }}

上述類繼承了Shiro的AuthorizingRealm類 實現(xiàn)了AuthorizationInfoAuthenticationInfo兩個方法,,用于獲取用戶權(quán)限和認證用戶登錄信息


5、編寫LoginController:



package org.swinglife.controller;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.subject.Subject;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.portlet.ModelAndView;import org.swinglife.model.User;import org.swinglife.service.AccountService;/**** * 用戶登錄Controller * * @author Swinglife * */@Controllerpublic class LoginController { /*** * 跳轉(zhuǎn)到登錄頁面 * * @return */ @RequestMapping(value = 'toLogin') public String toLogin() { // 跳轉(zhuǎn)到/page/login.jsp頁面 return 'login'; } /*** * 實現(xiàn)用戶登錄 * * @param username * @param password * @return */ @RequestMapping(value = 'login') public ModelAndView Login(String username, String password) { ModelAndView mav = new ModelAndView(); User user = accountService.getUserByUserName(username); if (user == null) { mav.setView('toLogin'); mav.addObject('msg', '用戶不存在'); return mav; } if (!user.getPassword().equals(password)) { mav.setView('toLogin'); mav.addObject('msg', '賬號密碼錯誤'); return mav; } SecurityUtils.getSecurityManager().logout(SecurityUtils.getSubject()); // 登錄后存放進shiro token UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword()); Subject subject = SecurityUtils.getSubject(); subject.login(token); // 登錄成功后會跳轉(zhuǎn)到successUrl配置的鏈接,,不用管下面返回的鏈接,。 mav.setView('redirect:/home'); return mav; } // 處理用戶業(yè)務(wù)類 @Autowired private AccountService accountService;}


6、編寫信息認證成功后的跳轉(zhuǎn)頁面:


package org.swinglife.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class IndexController { @RequestMapping('home') public String index() { System.out.println('登錄成功'); return 'home'; }}


7,、Shiro的配置文件.xml


/toLogin = authc /home = authc, perms[/home]



loginUrl 用于配置登陸頁

successUrl 用于配置登錄成功后返回的頁面,,不過該參數(shù)只會在當?shù)卿涰撁嬷胁]有任何返回頁面時才會生效,否則會跳轉(zhuǎn)到登錄Controller中的指定頁面,。

unauthorizedUrl 用于配置沒有權(quán)限訪問頁面時跳轉(zhuǎn)的頁面


filterChainDefinitions:apache shiro通過filterChainDefinitions參數(shù)來分配鏈接的過濾,,資源過濾有常用的以下幾個參數(shù):

1,、authc 表示需要認證的鏈接

2、perms[/url] 表示該鏈接需要擁有對應(yīng)的資源/權(quán)限才能訪問

3,、roles[admin] 表示需要對應(yīng)的角色才能訪問

4,、perms[admin:url] 表示需要對應(yīng)角色的資源才能訪問


8、登陸頁login.jsp

user login

username:

password:

${msg }





9,、運行程序

在數(shù)據(jù)庫中添加一條用戶,、角色、以及權(quán)限數(shù)據(jù),,并且在關(guān)聯(lián)表中添加一條關(guān)聯(lián)數(shù)據(jù):








在瀏覽器中訪問: home頁面 就會跳轉(zhuǎn)到登錄頁面:  


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多