[Shiro教程] Shiro 教程基於SSM(SpringMVC + Spring + Mybatis)EHCache版本
一、Shiro簡介
Apache Shiro 是 Java 的一個安全框架。我們經常看到它被拿來和 Spring 的 Security 來對比。大部分人認為 Shiro 比 Security 要簡單。我的觀點贊成一半一半吧。
首先 Shiro 確實和 Security 是同類型的框架,主要用來做安全,也就是我們俗稱的許可權校驗(控制)。居多人對 Shrio 的定義為好入門。
我選型為 Shiro ,主要的原因擴充套件太easy了,而且我要的功能它都有。
二、概述
前段時間出了一個基於SSM(SpringMVC + Spring + Mybatis)的Shiro 教程Demo,Cache(Nosql)是基於Ehcache的,但是很多同學卡在了Redis上,經常執行起來。所以現在出一版本基於
後續會陸陸續續新增N多相關的功能。以不同版本的方式釋出。
三、需要你的贊助
如果幫助到了您,請你在下載程式碼後,執行後,跑起來後,加群幫你解決問題後,興奮、喜悅、憤怒、喪氣、不知所措... ... 的時候,請贊助我,錢多少不重要,學生請不要贊助(富二代請忽略)。
四、請遵循三要素
- 建議你看完本篇文件所有內容,再進行執行專案。
- 在沒熟練之前,除了必要的配置修改,請勿改動任何配置和包路徑。
- 有疑問先看文件,交流加QQ群:
259217951
即可,群裡沒人理你@群主即可。
五、環境準備
5.1 開發工具
如果使用Eclipse的同學,請安裝好Maven環境,如果沒有Maven環境,又不想安裝,那麼請在附件中下載依賴包,自己把專案轉成Java Web專案然後進行執行。
如果使用Idea
作為開發工具的同學,注意配置resources
,還有一些其他的配置需要自己處理,不像匯入 MyEclipes
直接能跑起來。
5.2 依賴第三方
因為是基於 Ehcache ,所以也沒有其他第三方。
主要就是一個 Mysql 資料庫。資料庫的版本為 Mysql5.6
,估計Mysql5.5
,Mysql5.6
都沒問題,Mysql5.7
六、環境配置及要求,JDK版本,初始化配置
6.1 JDK版本要求
JDK 版本要求為JDK1.7+
,我開發的版本是1.7.0_80
,JDK1.6
有些jar
包會報錯,推薦使用JDK1.7
以上。
如果出現以下類似錯誤,那就是JDK版本不相符。
Unsupported major.minor version 51.0
其中各個版本對應的提示如下:
JDK1.5對應為Unsupported major.minor version 49.0
JDK1.6對應為Unsupported major.minor version 50.0
JDK1.7對應為Unsupported major.minor version 51.0
JDK1.8對應為Unsupported major.minor version 52.0
6.2 初始化配置
6.2.1 Mysql資料庫初始化
本教程不支援自動建立表和插入資料,在專案的init/sql
下有三個sql 檔案,分別為:tables.sql
(插入表)、init.data.sql
(插入初始化資料)、init_shiro_demo.sql
(插入初始化儲存過程)。
執行的過程為: tables.sql
(插入表)===> init.data.sql
(插入初始化資料)就可以了。
儲存過程可以是定時任務 com.sojson.common.timer.ToTimer
中定時任務呼叫的儲存過程。每20分鐘一次。想看看效果的同學,可以把spring.xml
配置檔案中的spring-timer.xml
註釋開啟就可以。
資料庫配置:jdbc.properties
配置你的資料庫連結。
jdbc.url=jdbc:mysql://localhost:3306/shiro.demo
jdbc.username=root
jdbc.password=123456
其他配置預設的即可,先跑起來,跑起來沒問題後,看看配置檔案,有問題和疑問在群裡交流。
PS:如果你確實要用Mysql5.7,那麼在Mysql的安裝目錄下找到。my.ini
或者my_default.ini
裡面配置sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
即可。
6.3 Maven環境說明
本教程是用 Maven 管理Jar包及執行打包,如果你發現 Maven
一直在下載jar
包,時間過久的話,建議你換成阿里的資料來源。開啟你的 Maven
目錄的setting.xml
檔案,如果沒有直接新增即可,官方群裡有setting.xml
檔案作為參考。
主要改個本地Maven
目錄,改成你自己的目錄即可:
<localRepository>E:\maven\repository</localRepository>
再配置一個mirror,找到標籤為mirrors,然後在裡面新增或者修改為阿里的Maven庫,如下圖:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
異常解決
常見的異常有3種。
- 如果有部分包打紅
×
,可以刪除這個包路徑,再次專案右鍵Maven選項(每個工具不一樣)
==>Update Maven Dependencies
更新即可。 - 如果下載好
Jar
包,也不報錯,但是在執行專案的時候,報錯zip
相關異常,那麼刪除Maven
目錄下所有下好的jar
包,然後再來下載一次。因為是下載的包是損壞的。 - 還有 Maven
的 JDK 版本需要和你專案一致,有的工具預設配置是
JDK1.5
。
6.4 其他說明
編碼格式:UTF-8
,換成其他編碼格式可能會有瑕疵。
Spring相關Jar版本為:Spring 4.2.5
前端頁面採用:Bootstarp 3.2
。
其他依賴:jQuery1.8.3
、layer
控制元件。
6.5 View層說明
七、教程功能詳細說明
下面各點是針對(SSM)SpringMvc + Spring + Mybatis框架說明,以及一些使用方式和基本功能介紹。
7.1.1 框架基本介紹
本教程是SSM( SpringMVC +Spring
+ Mybatis + Freemarker
) + Ehcache 做的整體Shiro
Demo
,其他框架需要自己自行解決,所以不做框架 其他 的講解,其實是大同小異。
7.1.2 分頁介紹
本框架裡的分頁比較Low,分頁的ServiceImpl
要繼承 BaseMybatisDao<T>
,這裡泛型的<T>
為當前實體物件對應的Mapper.xml
檔案,其實就是Mapper.xml
的namespace
。呼叫父類的findPage
相關。
Service Impl Java 程式碼:
publicPagination<UserRoleAllocationBo> findUserAndRole(ModelMap modelMap,
Integer pageNo,Integer pageSize){
//findUserAndRole : 為查詢資料(sqlID)
//findCount : 為查詢符合資料的總條數(sqlID)
returnsuper.findPage("findUserAndRole","findCount", modelMap, pageNo, pageSize);
}
分頁查詢使用預設的sqlId
。
publicPagination<UPermission> findPage(Map<String,Object> resultMap,Integer pageNo,
Integer pageSize){
/**
* 呼叫父類的分頁查詢,預設資料查詢sqlId = findAll , count 查詢sqlId = findCount
*/
returnsuper.findPage(resultMap, pageNo, pageSize);
}
Mapper.xml 檔案 Sql 程式碼,和上面一 一對應:
<selectid="findCount"resultMap="BaseResultMap">
select count(id) from u_user
<includerefid="where_all"/>
</select>
<!-- 使用者許可權分配的分頁查詢 -->
<selectid="findUserAndRole"resultType="com.sojson.permission.bo.UserRoleAllocationBo">
select u.id,u.nickname,u.email,u.create_time,u.last_login_time,u.status ,group_concat(ur.name) roleNames,group_concat(ur.id)roleIds from
u_user u
left join u_user_role uur on uur.uid = u.id
left join u_role ur on ur.id = uur.rid
<where>
<iftest="findContent != null and findContent !='' ">
and (
LOWER(u.nickname) like LOWER(CONCAT("%",#{findContent,jdbcType=VARCHAR},"%")) or
LOWER(u.email) like LOWER(CONCAT("%",#{findContent,jdbcType=VARCHAR},"%"))
)
</if>
</where>
group by u.id
</select>
<selectid="findAll"resultMap="BaseResultMap">
select
<includerefid="Base_Column_List"/>
from u_permission
<includerefid="where_all"/>
<includerefid="limit_sql"/>
</select>
<selectid=