Shiro系統許可權管理、及原理剖析
1.簡介
常用的JavaEE安全框架有shiro、spring security。shiro被應用非常廣泛,可以整合cas,搭建單點登入系統。spring security則被認為比較重,應用沒有shiro廣泛。shiro提供使用者名稱、密碼驗證,及密碼的加密儲存,會話Session的管理,與web整合,支援HTTPS的攔截。
2.Shiro原理簡析
shiro 原理剖析:
shiro的核心是java servlet規範中的filter,通過配置攔截器,使用攔截器鏈來攔截請求,如果允許訪問,則通過。通常情況下,系統的登入、退出會配置攔截器。登入的時候,呼叫subject.login(token),token是使用者驗證資訊,這個時候會在Realm中doGetAuthenticationInfo方法中進行認證。這個時候會把使用者提交的驗證資訊與資料庫中儲存的認證資訊進行比較,一致則允許訪問,並在瀏覽器種下此次回話的cookie,在伺服器端儲存session資訊。退出的時候,呼叫subject.logout(),會清除回話資訊。 shiro中核心概念介紹:3.Shiro配置方法
shiro 配置方法:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:util="http://www.springframework.org/schema/util"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
- http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
- <description>Apache Shiro Security Configuration</description>
- <!-- Realm實現 -->
- <beanid="userRealm"class="com.ttyc.mammon.service.shiro.UserRealm">
- <propertyname="cachingEnabled"value="false"/>
- </bean>
- <!-- 會話ID生成器 -->
- <beanid="sessionIdGenerator"class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>
- <!-- 會話Cookie模板 -->
- <beanid="sessionIdCookie"class="org.apache.shiro.web.servlet.SimpleCookie">
- <constructor-argvalue="sid"/>
- <propertyname="domain"value=".ttyongche.com"/>
- <propertyname="path"value="/"/>
- <propertyname="httpOnly"value="false"/>
- <propertyname="maxAge"value="-1"/>
- </bean>
- <!-- 會話DAO -->
- <beanid="sessionDAO"class="org.crazycake.shiro.RedisSessionDAO">
- <propertyname="sessionIdGenerator"ref="sessionIdGenerator"/>
- <propertyname="redisManager"ref="redisManager"/>
- </bean>
- <!-- 會話管理器 -->
- <beanid="sessionManager"class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
- <propertyname="globalSessionTimeout"value="1800000"/>
- <propertyname="deleteInvalidSessions"value="true"/>
- <propertyname="sessionDAO"ref="sessionDAO"/>
- <propertyname="sessionIdCookieEnabled"value="true"/>
- <propertyname="sessionIdCookie"ref="sessionIdCookie"/>
- </bean>
- <!-- 安全管理器 -->
- <beanid="securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <propertyname="realm"ref="userRealm"/>
- <propertyname="sessionManager"ref="sessionManager"/>
- <propertyname="cacheManager"ref="redisCacheManager"/>
- </bean>
- <!-- 相當於呼叫SecurityUtils.setSecurityManager(securityManager) -->
- <beanclass="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
- <propertyname="staticMethod"value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
- <propertyname="arguments"ref="securityManager"/>
- </bean>
- <beanid="authFilter"class="com.ttyc.mammon.controller.filter.AuthFilter"/>
- <beanid="permissionFilter"class="com.ttyc.mammon.controller.filter.PermissionFilter"/>
- <!-- Shiro的Web過濾器 -->
- <beanid="shiroFilter"class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
- <propertyname="securityManager"ref="securityManager"/>
- <propertyname="loginUrl"value="/login"/>
- <propertyname="filters">
- <util:map>
- <entrykey="auth"value-ref="authFilter"/>
- <entrykey="perm"value-ref="permissionFilter"/>
- </util:map>
- </property>
- <propertyname="filterChainDefinitions">
- <value>
- /** = auth
- </value>
- </property>
- </bean>
- <!-- Shiro生命週期處理器-->
- <beanid="lifecycleBeanPostProcessor"class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
- <!-- cacheManager -->
- <beanid="redisCacheManager"class="org.crazycake.shiro.RedisCacheManager">
- <propertyname="redisManager"ref="redisManager"/>
- </bean>
- <!-- shiro redisManager -->
- <beanid="redisManager"class="com.ttyc.mammon.service.shiro.RedisManager">
- <propertyname="host"value="${redis.host}"/>
- <propertyname="port"value="${redis.port}"/>
- <propertyname="expire"value="${redis.expire}"/>
- <propertyname="dataBase"value="${redis.database}"/>
- </bean>
- </beans>
Pom依賴: <shiro.version>1.2.2</shiro.version> <shiro.redis.version>2.4.2.1-RELEASE</shiro.redis.version>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-core</artifactId>
- <version>${shiro.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-web</artifactId>
- <version>${shiro.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-spring</artifactId>
- <version>${shiro.version}</version>
- </dependency>
- <dependency>
- <groupId>org.crazycake</groupId>
- <artifactId>shiro-redis</artifactId>
- <version>${shiro.redis.version}</version>
- </dependency>
UserRealm: 繼承AuthorizingRealm,重寫doGetAuthorization和doGetAuthorication方法。
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
- String username = (String)principals.getPrimaryPrincipal();
- SysUser user = getUserByName(username);
- SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
- SysRole sysRole = sysRolePermService.getSysRoleByUserId(user.getId());
- addRole(authorizationInfo,sysRole);
- List<SysPermission> sysPermissions = sysRolePermService.getSysPermissionByUserId(user.getId());
- addPermissions(authorizationInfo,sysPermissions);
- return authorizationInfo;
- }
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
- String username = (String)token.getPrincipal();
- SysUser user = getUserByName(username);
- //交給AuthenticatingRealm使用CredentialsMatcher進行密碼匹配,如果覺得人家的不好可以自定義實現
- if (user != null){
- returnnew SimpleAuthenticationInfo(user.getUserName(),"", getName());
- }
- returnnull;
- }
AuthFilter: AuthFilter繼承AccessControllerFilter,需要重寫isAccessAllowed和onAccessDenied方法
- @Override
- protectedboolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
- HttpServletRequest httpRequest = (HttpServletRequest)request;
- HttpServletResponse httpResponse = (HttpServletResponse)response;
- //支援跨域
- supportCrossDomain(httpResponse);
- // 對外API,通過Service-Token進行認證
- String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());
- if (url.startsWith(HTTP_API_URL)) {
- if (validateSign(httpRequest.getHeader("Service-Token"))) {
- returntrue;
- }
- else {
- returnfalse;
- }
- }
- //運營後臺通過cookie,token,sid進行認證
- Subject currentSubject = SecurityUtils.getSubject();
- if (! currentSubject.isAuthenticated()){
- SysUser sysTokenUser = loginAuthService.validTokenAuth((HttpServletRequest) request);
- SysUser sysCookieUser = loginAuthService.validCookieAuth((HttpServletRequest) request);
- if (sysTokenUser == null && sysCookieUser == null){
- returnfalse;
- }
- SysUser sysUser = null;
- if (sysTokenUser != null){
- sysUser = sysTokenUser;
- }else {
- sysUser = sysCookieUser;
- }
- UsernamePasswordToken token = new UsernamePasswordToken(sysUser.getUserName(),"");
- currentSubject.login(token);
- Session session = currentSubject.getSession();
- session.setAttribute("LoginUser",sysUser);
- }
- //在request裡設定登入使用者
- SysUser currentUser = (SysUser) currentSubject.getSession().getAttribute("LoginUser");
- request.setAttribute("loginId", currentUser.getId());
- returntrue;
- }
- @Override
- protectedboolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
- response.setContentType("application/json; charset=utf-8");
- response.getWriter().write(json);
- returnfalse;
- }
RedisManager: shiro原生不支援redis,只支援ehcache,ehcache只能單機快取,不適合於大型叢集應用。第三方crazycake支援shiro使用redis快取,配置方式如下:
- import redis.clients.jedis.Jedis;
- import redis.clients.jedis.JedisPool;
- import redis.clients.jedis.JedisPoolConfig;
- import java.util.Set;
- publicclass RedisManager extends org.crazycake.shiro.RedisManager {
- private String host = "127.0.0.1";
- privateint port = 6379;
- // 0 - never expire
- privateint expire = 0;
- // timeout for jedis try to connect to redis server, not expire time! In
- // milliseconds
- privateint timeout = 0;
- private String password = "";
- privateint dataBase;
- privatestatic JedisPool jedisPool = null;
- public RedisManager() {
- }
- /**
- * 初始化方法
- */
- publicvoid init() {
- if (jedisPool == null) {
- if (password != null && "".equals(password.trim())) {
- password = null;
- }
- jedisPool = new JedisPool(new JedisPoolConfig(), host, port, timeout, password, dataBase);
- }
- }
- /**
- * get value from redis
- *
- * @param key
- * @return
- */
- publicbyte[] get(byte[] key) {
- byte[] value = null;
- Jedis jedis = jedisPool.getResource();
- try {
- value = jedis.get(key);
- } finally {
- jedis.close();
- }
- return value;
- }
- /**
- * set
- *
- * @param key
- * @param value
- * @return
- */
- publicbyte[] set(byte[] key, byte[] value) {
- Jedis jedis = jedisPool.getResource();
- try {
- jedis.set(key, value);
- if (this.expire != 0) {
- jedis.expire(key, this.expire);
- }
- } finally {
- jedis.close();
- }
- return value;
- }
- /**
- * set
- *
- * @param key
- * @param value
- * @param expire
- * @return
- */
- publicbyte[] set(byte[] key, byte[] value, int expire) {
- Jedis jedis = jedisPool.getResource();
- try {
- jedis.set(key, value);
- if (expire != 0) {
- jedis.expire(key, expire);
- }
- } finally {
- jedis.close();
- }
- return value;
- }
- /**
- * del
- *
- * @param key
- */
- publicvoid del(byte[] key) {
- Jedis jedis = jedisPool.getResource();
- try {
- jedis.del(key);
- } finally {
- jedis.close();
- }
- }
- /**
- * flush
- */
- publicvoid flushDB() {
- Jedis jedis = jedisPool.getResource();
- try {
- jedis.flushDB();
- } finally {
- jedis.close();
- }
- }
- /**
- * size
- */
- public Long dbSize() {
- Long dbSize = 0L;
- Jedis jedis = jedisPool.getResource();
- try {
- dbSize = jedis.dbSize();
- } finally {
- jedis.close();
- }
- return dbSize;
- }
- /**
- * keys
- *
- * @param pattern
- * @return
- */
- public Set<byte[]> keys(String pattern) {
- Set<byte[]> keys = null;
- Jedis jedis = jedisPool.getResource();
- try {
- keys = jedis.keys(pattern.getBytes());
- } finally {
- jedis.close();
- }
- return keys;
- }
- public String getHost() {
- return host;
- }
- publicvoid setHost(String host) {
- this.host = host;
- }
- publicint getPort() {
- return port;
- }
- publicvoid setPort(int port) {
- this.port = port;
- }
- publicint getExpire() {
- return expire;
- }
- publicvoid setExpire(int expire) {
- this.expire = expire;
- }
- publicint getTimeout() {
- return timeout;
- }
- publicvoid setTimeout(int timeout) {
- this.timeout = timeout;
- }
- public String getPassword() {
- return password;
- }
- publicvoid setPassword(String password) {
- this.password = password;
- }
- publicint getDataBase() {
- return dataBase;
- }
- publicvoid setDataBase(int dataBase) {
- this.dataBase = dataBase;
- }
- }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.對有沒有訪問許可權的理解。 我們這裡要對系統中的 角色組、角色、使用者、功能 之間的關係要理清楚,http://blog.csdn.NET/baicp3/article/details/45028013方便下面使用者是否具有某一url的訪問。
我們看shiro的配置檔案,所以的請求都是需要使用者登入的
因而使用者 在登入成功時候,shiro已經把該使用者是否有訪問某一url的許可權已經判斷好了。
看下面簡單的程式碼
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection
principalCollection) {
//獲取當前登陸的使用者名稱
String loginName =
(String) principalCollection.fromRealm(getName()).iterator().next();
//根據使用者名稱查詢物件
User user = userService.findByLoginName(loginName);
if(user != null) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//新增角色(Set集合<字串>)
info.setRoles(user.getGroupNameSet());
//迭代使用者對應的角色集合,為了獲取角色對應的許可權
for(UserGroup g : user.getUserGroupList()) {
//新增permission
info.addStringPermissions(g.getPermissionStringList());
}
return info;
}
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken authenticationToken) throws AuthenticationException
{
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
//根據使用者名稱去查詢物件
User user = userService.findByLoginName(token.getUsername());
if(user != null) {
return new SimpleAuthenticationInfo(user.getName(),
user.getPassword(),getName());
}
return null;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
shiro其實已經幫我們寫好了方法,我們只要去重寫 首先看原始碼
本人系統這個類RapShiroRealm 去實現(
1.簡介
常用的JavaEE安全框架有shiro、spring security。shiro被應用非常廣泛,可以整合cas,搭建單點登入系統。spring
security則被認為比較重,應用沒有shiro廣泛。shiro提供使用者名稱、
Linux平臺下使用者基本管理機制及原理剖析(二)
在前面的部落格中,我們對虛擬環境下使用者的新建、檢視、刪除以及使用者組的新建和管理有了一定的瞭解,這篇文章我們
接著瞭解虛擬環境下的使用者資訊的更改、使用者認證資訊的檢視,使用者密碼的管理以及使用者授權。
1.使用者資
Linux平臺下使用者基本管理機制及原理剖析(一)
Linux是一個多使用者、多工的作業系統,具有很好的安全性和穩定性。
使用者和群組存在的意義
使用者的存在是為了使你的工作環境更加安全,就是有一個隱私空間,這個空間只有使用者本人有許可權。
而群組存在的意義是為了讓大家有
SAP系統的許可權管理主要是通過事務程式碼,許可權物件,許可權等3個關鍵物件構築的.
1. 事務程式碼(Tcode)
SAP系統中,每個操作命令都是唯一對應一個事務程式碼.事務程式碼是操作命令的表現形式.使用者通過輸入相應的事務程式碼
shell命令以及執行原理: Linux嚴格意義上說的是一個作業系統,我們稱之為”核心”,但是我們普通使用者,不能直接使用核心,而是通過核心的”外殼”程式,也就是所謂的shell,來與核心溝通。
Linux中的命令大多數都是可執行程式。但其實捕捉我們
演示地址: http://111.230.157.133/login
技術選型
後端
基礎框架:Spring Boot 2.0.4.RELEASE
持久層框架:Mybatis 3.4.5
安全框架:Apache Shiro 1.4.0 (店鋪裡面有 Spring Se 方便 sub text log 過去時 需要 cbe 理解 term Linux系統本身包含了很多服務,CentOS6之前系統的服務用SysV控制,CentOS7改為systemd控制
一、chkconfig服務管理機制
簡而言之,chkconfig就是CentOS6以前用
html5中新增的特性
1.語義化標籤,比如:<header> <footer> <article>等,可以使我們建立更友好的頁面結構,便於搜尋引擎抓取;
div是division的縮寫,你在網頁中寫了大量的div,就算你寫了class
檢視所有程序:netstat -ano檢視指定埠的程式:netstat -ano | findstr "8080" 殺死相關的程序: tasklist 當 DEBUG=True 時,django 內部的404報錯資訊,
自帶的報錯資訊,
要自定義404資訊,要先把 DEBUG=False ,
之後要自定義4040頁面,有兩種方法,
方法1,在建立404頁面
這樣就配置完成,當訪問不存在的頁面時,跳轉到自定義的4
文章目錄
role許可權管理,對不同的角色可授予不同許可權,顯示不同專案。
密碼等私密資訊過濾顯示
role許可權管理,對不同的角色可授予不同許可權,顯示不同專案。
需要安裝外掛:Role-based Authoriz
最近在重新整理搜書吧(一個做圖書比價的平臺)的系統架構,目前圖書產品數量超過了200萬條。各種資料加起來超過40G了,使用Mysql資料庫儲存伺服器吃不消,於是考慮使用HBase儲存大部分資料。
一、摘要
以前搜書吧的資料量比較小,使用資料庫+靜態檔案儲存的方式就可以搞
許可權:(檔案和目錄的許可權)
-rw-r--r--. 1 tom police 0 Sep 29 19:05 ok.txt
-:{檔案型別:- 表普通檔案 d:目錄 l:軟連結 c:字元裝置【鍵盤,滑鼠】 b:塊檔案,硬碟 }
rw- :{表示檔案所有者擁有的許可
檔案許可權管理 suid,sgid,sbit
1.suid 讓二進位制程式的執行者臨時擁有屬主的許可權
2.sgid 讓二進位制程式的執行者臨時擁有屬組的許可權,並且在某個目錄中建立的檔案自動繼承該目錄的使用者組(只可以對目錄進行設定)。
3.sticky 特殊
使用者和使用者組管理
1、使用者配置檔案位置
-》cat /etc/passwd
2、root: x:0:0:root:/root:/bin/bash
-》root 代表使用者名稱
-》x 密碼標識, 一、一些python的知識
1、偏函式
def add(x, y, z):
print(x + y + z)
# 原本的寫法:x,y,z可以傳任意數字
add(1,2,3)
# 如果我要實現一個功能,這三個數中,其中一個數必須是3
# 我們就可以使用偏函式來幫著我們 linux/UNIX檔案的存取有三種許可權:許可權 普通檔案的存取許可權 目錄的存取許可權R 具有讀取檔案的權利 能讀取檔名稱W 具有寫入檔案的權利 能建立和刪除檔案,可以改變檔名X 具有執行檔案的權利 能使用該目錄下的檔案(如cd命令)搜尋檔案等能夠存取檔案的使用者型別有三種類型的使用者可以存取檔案:使用者
uid:使用者標識號 gid:組標識號 預設情況下,使用者uid和gid一樣
使用者的分類:
超級使用者(root):許可權特別大,uid=0,gid=0,生產環境建議不要使用
普通使用者:uid>=500,Ubuntu一般>=1000,一般許可權系統管理,
本文內容大部分來自黑馬視訊的SpringBoot與Shiro整合-許可權管理實戰視訊,在此記錄為個人學習筆記。
可按步驟操作,無法實操的實戰blog都是耍流氓。
七、Shiro授權-使用Shiro過濾器實現授權頁面攔截
1. 在S
最近在做一個許可權相關的功能,在專案原有許可權管理上面進行擴充套件,一方面支援介面上控制到按鈕級別,後端介面沒有許可權不能進行訪問;另一個方面,對專案中應用管理模組的應用管理員授權,使其具有對其名下的 相關推薦
Shiro系統許可權管理、及原理剖析
Linux平臺下使用者基本管理機制及原理剖析(二)
Linux平臺下使用者基本管理機制及原理剖析(一)
SAP系統許可權管理及引數設定
shell命令以及執行原理、檢視或修改掩碼(umask)、Linux許可權管理、Linux設定檔案訪問許可權(chmod)、粘滯位、修改檔案的擁有者(chown)、修改檔案的所屬組(chgrp)
SpringBoot+mybatis+Shiro+redis許可權管理系統原始碼
Linux系統管理初步(七)系統服務管理、chkconfig與systemd 編輯中
HTML5總結及原理剖析
Windows系統檢視程序、及殺死程序的相關命令
潭州課堂25班:Ph201805201 django框架 第十三課 自定義404頁面,auth系統中的User模型,auth系統許可權管理 (課堂筆記)
Jenkins常用外掛分享(role許可權管理、密碼掩蓋)
後臺管理系統 – 許可權管理
Liinux(許可權管理、組管理)
week2(2)許可權管理、vi的使用
【Linux】使用者和使用者組管理、許可權管理、vi編輯器、sudo許可權管理
Flask上下文管理、session原理和全域性g物件
[教程]linux/UNIX作業系統檔案系統許可權管理
Linux使用者管理、許可權管理、歸檔、壓縮以及建立連線和測試網路網路連通性
SpringBoot與Shiro整合-許可權管理實戰視訊筆記(之三)
Java Web許可權管理設計及實現