shiro+mysql動態(tài)驗證

2.1、數(shù)據(jù)庫設(shè)計
在實際開發(fā)中荒吏,用戶名密碼、角色渊鞋、權(quán)限需要存在數(shù)據(jù)庫中動態(tài)管理绰更。一個簡單的Shiro+MySQL的項目需要三張表瞧挤,表結(jié)構(gòu)及初始化數(shù)據(jù)如下:
shiro_user表:

DROP TABLE IF EXISTS `shiro_user`;
CREATE TABLE `shiro_user`  (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `USER_NAME` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  `PASSWORD` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
INSERT INTO `shiro_user` VALUES (1, 'test', '123456');

shiro_user_role表:

DROP TABLE IF EXISTS `shiro_user_role`;
CREATE TABLE `shiro_user_role`  (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `USER_NAME` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  `ROLE_NAME` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
INSERT INTO `shiro_user_role` VALUES (1, 'test', 'role1');

shiro_role_permission表:

DROP TABLE IF EXISTS `shiro_role_permission`;
CREATE TABLE `shiro_role_permission`  (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `ROLE_NAME` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  `PERM_NAME` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
INSERT INTO `shiro_role_permission` VALUES (1, 'role1', 'perm1');

2.2、添加依賴

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.32</version>
</dependency>

2.3儡湾、配置文件
在resources文件夾下新建一個shiro.ini內(nèi)容如下:

[main]
dataSource=org.springframework.jdbc.datasource.DriverManagerDataSource
#
dataSource.driverClassName=com.mysql.jdbc.Driver
# user:數(shù)據(jù)庫名
dataSource.url=jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
# 用戶名
dataSource.username=root
#如果數(shù)據(jù)庫沒有密碼特恬,就不要寫這行
dataSource.password=123456
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#是否檢查權(quán)限
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm.dataSource=$dataSource
#重寫sql語句
#根據(jù)用戶名查詢出密碼
jdbcRealm.authenticationQuery = select password from shiro_user where user_name = ?
#根據(jù)用戶名查詢出角色
jdbcRealm.userRolesQuery = select role_name from shiro_user_role where user_name = ?
#根據(jù)角色名查詢出權(quán)限
jdbcRealm.permissionsQuery = select perm_name from shiro_role_permission where role_name = ?
securityManager.realms=$jdbcRealm

2.4、測試代碼
跟上一篇的一樣徐钠,看過的可以跳過

public class ShiroTest {
    private static final transient Logger log =
            LoggerFactory.getLogger(ShiroTest.class);

    public static void main(String[] args){
        //1癌刽、SecurityManager:classpath:shiro.ini
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

        //2、解析配置文件尝丐,并返回一些SecurityManager
        SecurityManager securityManager = factory.getInstance();

        //3显拜、SecurityManager綁定給SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);

        //4、安全操作爹袁,Subject是當前登錄的用戶
        Subject currentUser = SecurityUtils.getSubject();

        //5远荠、測試在應(yīng)用的當前回話中設(shè)置屬性
        Session session = currentUser.getSession();

        //如果用戶沒有登陸過
        if(!currentUser.isAuthenticated()){
            UsernamePasswordToken token = new UsernamePasswordToken("test","123456");
            //記住我
            token.setRememberMe(true);
            try{
                currentUser.login(token);
                log.info("用戶【"+currentUser.getPrincipal()+"】 登錄成功");
                //登錄之后查看是否擁有指定角色
                if(currentUser.hasRole("admin")){
                    log.info("有admin角色");
                }else{
                    log.info("沒有admin角色");
                }
                if(currentUser.hasRole("role1")){
                    log.info("有role1角色");
                }else{
                    log.info("沒有role1角色");
                }
                //查看用戶是否擁有某個權(quán)限
                if(currentUser.isPermitted("perm1")){
                    log.info("有perm1權(quán)限");
                }else{
                    log.info("沒有perm1權(quán)限");
                }
                if(currentUser.isPermitted("guest")){
                    log.info("有g(shù)uest權(quán)限");
                }else{
                    log.info("沒有g(shù)uest權(quán)限");
                }
                //登出
                currentUser.logout();
            }catch (UnknownAccountException uae){
                log.info(token.getPrincipal()+" 賬戶不存在");
            }catch (IncorrectCredentialsException ice){
                log.info(token.getPrincipal()+" 密碼不正確");
            }catch (LockedAccountException lae){
                log.info(token.getPrincipal()+" 用戶被鎖定了 ");
            }catch (AuthenticationException ae){
                //無法判斷是什么錯
                log.info(ae.getMessage());
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市失息,隨后出現(xiàn)的幾起案子譬淳,更是在濱河造成了極大的恐慌,老刑警劉巖根时,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘦赫,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛤迎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門含友,熙熙樓的掌柜王于貴愁眉苦臉地迎上來替裆,“玉大人,你說我怎么就攤上這事窘问×就” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵惠赫,是天一觀的道長把鉴。 經(jīng)常有香客問我,道長儿咱,這世上最難降的妖魔是什么庭砍? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮混埠,結(jié)果婚禮上怠缸,老公的妹妹穿的比我還像新娘。我一直安慰自己钳宪,他們只是感情好揭北,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布扳炬。 她就那樣靜靜地躺著,像睡著了一般搔体。 火紅的嫁衣襯著肌膚如雪恨樟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天疚俱,我揣著相機與錄音厌杜,去河邊找鬼。 笑死计螺,一個胖子當著我的面吹牛夯尽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播登馒,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼匙握,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奋刽,失蹤者是張志新(化名)和其女友劉穎注暗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盗冷,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛔琅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡峻呛,死狀恐怖罗售,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钩述,我是刑警寧澤寨躁,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站牙勘,受9級特大地震影響职恳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜方面,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一放钦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葡幸,春花似錦最筒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辙培。三九已至,卻和暖如春邢锯,著一層夾襖步出監(jiān)牢的瞬間扬蕊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工丹擎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尾抑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓蒂培,卻偏偏與公主長得像再愈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子护戳,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • wyun_guest需要添加的地方 1: oauth_clients需要添加一條記錄image.png INSER...
    EddieZhang閱讀 667評論 0 0
  • “區(qū)塊鏈”作為2018年最被關(guān)注的行業(yè)翎冲,許多人對于這個陌生的領(lǐng)域,都會用帶有千萬種疑問的眼光去看待它媳荒,尤其是對一些...
    山高云飛閱讀 215評論 0 0
  • 夏日涼菜抗悍,手撕雞腿肉~ 制作配料: 雞腿 4個; 花椒钳枕,桂皮缴渊,香葉 各2-3個; 蒜一瓣鱼炒,新鮮剁椒1個衔沼,蔥姜N; ...
    蓮箐閱讀 385評論 1 1
  • 世上真的有妖精嗎,不知道,但蛇精應(yīng)該是有的! 蛇在這世上應(yīng)該是最常見的動物之一,種類繁多,讓人眼花繚亂田柔。作為人的先...
    高嘉蜘票寂然閱讀 353評論 0 0
  • [**30日晚百景團圓飯名單**] **交通一班:** 男生:溫智和(在校)俐巴,王凱(在校) 植偉恒(在...
    穆諾閱讀 160評論 0 0