大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 關(guān)于Shiro訪問權(quán)限控制

關(guān)于Shiro訪問權(quán)限控制

更新時間:2022-12-20 10:30:36 來源:動力節(jié)點 瀏覽1460次

Shiro訪問權(quán)限控制是什么?動力節(jié)點小編來為大家進行詳細的介紹。

權(quán)限控制

1.什么是權(quán)限控制

白話文:控制某某用戶可以/不可以訪問某某功能。

我們今天的Shiro訪問權(quán)限控制,實際上就是對資源加鎖,每個鎖都有一些規(guī)則,只有對應(yīng)的鑰匙才能打開,我們根據(jù)用戶的角色,將鑰匙分配給不同用戶。

2.權(quán)限控制的方式

(1)基于過濾器進行控制。比如我們servlet中的filter

(2)基于注解進行控制。可以借助spring的AOP進行控制。

(3)直接在業(yè)務(wù)代碼中判斷(不可取)

(4)頁面標簽的權(quán)限控制——不太常用。

shiro簡介

1.功能

認證:即我們常說的登錄

授權(quán):給予用戶資源權(quán)限

會話:當前認證用戶會話

緩存:緩存認證權(quán)限等

2.權(quán)限控制方式:

filter方式

//設(shè)置過濾匹配路徑和判斷規(guī)則
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
filterChainDefinitionMap.put("/**", "anon");//可以匿名訪問
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

注解方式

//在具體的方法上添加注解
@RequiresAuthentication :表示當前Subject已經(jīng)認證:Subject.isAuthenticated()返回true
@RequiresUse:表示當前Subject已經(jīng)身份驗證或者通過記住我登錄的
@RequiresGuest :表示當前Subject沒有身份驗證或通過記住我登錄過,即是游客身份
@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND)
@RequiresPermissions(value={“user:select”, “user:all”}, logical= Logical.OR) 

只是用注解是不生效的,需要添加配置

/**
* 注解支持:
*/
@Bean
@ConditionalOnMissingBean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
    DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
    defaultAAP.setProxyTargetClass(true);
    return defaultAAP;
}?
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
    return authorizationAttributeSourceAdvisor;
}

標簽(了解)

注意,此處使用的是thymeleaf做視圖界面展示,并非jsp

<!--輸出當前用戶信息,通常為登錄帳號信息。如果存入的principal是對象,可以通過property取值-->
<span> <shiro:principal property="username"/> </span>
<!--驗證當前用戶是否擁有指定權(quán)限。  -->
<a shiro:hasPermission="user:select" href="#" >查看用戶列表</a><!-- 擁有權(quán)限 -->
<!--與hasPermission標簽邏輯相反,當前用戶沒有制定權(quán)限時,驗證通過。-->
<p shiro:lacksPermission="user:del"> 沒有權(quán)限 </p>
<!--驗證當前用戶是否擁有以下所有權(quán)限。-->
<p shiro:hasAllPermissions="user:view, user:add">擁有所有才能訪問</p>
<!--驗證當前用戶是否擁有以下任意一個權(quán)限。-->
<p shiro:hasAnyPermissions="user:view, user:del">擁有任意一個即可訪問</p>
<!--驗證當前用戶是否屬于該角色。-->
<a shiro:hasRole="role_admin" href="#">是role_admin角色</a> 
<!--與hasRole標簽邏輯相反,當用戶不屬于該角色時驗證通過。-->
<p shiro:lacksRole="role_admin">我沒有role_admin角色</p>  
<!--驗證當前用戶是否屬于以下所有角色。-->
<p shiro:hasAllRoles="developer, admin"> 角色與判斷 </p>  
<!--驗證當前用戶是否屬于以下任意一個角色。-->
<p shiro:hasAnyRoles="admin, vip, developer"> 角色或判斷 </p> 
<!--驗證當前用戶是否為“訪客”,即未認證(包含未記住)的用戶。-->
<p shiro:guest="">訪客 未認證</a></p>   
<!--已認證通過的用戶。不包含已記住的用戶,這是與user標簽的區(qū)別所在。-->
<p shiro:authenticated=""> <span shiro:principal=""></span> </p>    
<!--未認證通過用戶,與authenticated標簽相對應(yīng)。-->
<!--與guest標簽的區(qū)別是,該標簽包含已記住用戶。-->
<p shiro:notAuthenticated=""> 未認證通過用戶 </p>

springboot整合shiro

1.SecurityManager

@Bean
public SecurityManager securityManager(){
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    List<Realm> realms = new ArrayList<Realm>();
    realms.add(customRealm());
    securityManager.setRealms(realms);
    securityManager.setSessionManager(sessionManager());
    return securityManager;
}

2.Realm

//主要用作封裝認證、授權(quán)信息,返回給安全管理器處理
@Bean
public CustomRealm customRealm(){
    CustomRealm customRealm = new CustomRealm();
    //設(shè)置密碼校驗算法——需要和加密算法一致
    customRealm.setCredentialsMatcher(credentialsMatcher());
    return customRealm;
}?
@Bean
public CredentialsMatcher credentialsMatcher(){
    HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
    hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列算法:這里使用MD5算法;
    //        hashedCredentialsMatcher.setHashIterations(2);
    return hashedCredentialsMatcher;
}

3.ShiroFilter

@Bean
public ShiroFilterFactoryBean shiroFilter2(SecurityManager securityManager){
    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    shiroFilterFactoryBean.setSecurityManager(securityManager);
    shiroFilterFactoryBean.setLoginUrl("/admin/toPage");
    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
    //訪問控制
    filterChainDefinitionMap.put("/admin/toPage", "anon");//可以匿名訪問
    filterChainDefinitionMap.put("/admin/login", "anon");//可以匿名訪問
    filterChainDefinitionMap.put("/storage/list", "perms[user:select]");//可以匿名訪問
    //        filterChainDefinitionMap.put("/", "anon");//可以匿名訪問
    filterChainDefinitionMap.put("/**", "anon");//可以匿名訪問
    shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
    return shiroFilterFactoryBean;
}

4.SessionManager

@Bean
public SessionManager sessionManager() {
    DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
    sessionManager.setSessionDAO(redisSessionDAO());?
    //設(shè)置會話過期時間
    sessionManager.setGlobalSessionTimeout(3*60*1000); //默認半小時
    sessionManager.setDeleteInvalidSessions(true); //默認自定調(diào)用SessionDAO的delete方法刪除會話?
    //設(shè)置會話定時檢查
    sessionManager.setSessionValidationInterval(180000); //默認一小時
    sessionManager.setSessionValidationSchedulerEnabled(true);
    return sessionManager;
}?
@Bean
public SessionDAO redisSessionDAO(){
    ShiroSessionRedisDAO redisDAO = new ShiroSessionRedisDAO();
    return redisDAO;
}

5.用戶新增

在controller中接收新增用戶后,交給service的saveAdmin做密碼加密后保存

public void saveAdmin(Administrator admin) {
    //對密碼進行加密處理
    //1.得到明文密碼
    String password = admin.getPassword();
    //2.生成隨機鹽 4-8位的隨機數(shù)字
    String randomSalt = RandomStringUtils.randomNumeric(4, 8);
    admin.setPrivateSalt(randomSalt);
    //3.md5加密 添加隨機鹽,加密次數(shù)1次(當然,這個一次可以配置在配置文件在,此處注入讀取)
    Md5Hash md5Hash = new Md5Hash(password,randomSalt,1);
    String hashPwd = md5Hash.toString();
    admin.setPassword(hashPwd);
    userMapper.insert(admin);
}

6.用戶登錄

認證

@Controller
@RequestMapping("/admin")
public class LoginController {
    @PostMapping("/login")
    public String login(
        @RequestParam("username") String username, 
        @RequestParam("password") String password,Model map){
        try {
            Subject subject = SecurityUtils.getSubject();
            //處理登錄的用戶名密碼token
            UsernamePasswordToken token = 
                new UsernamePasswordToken(username, password);
            //登錄(開始認證)
            subject.login(token);
            return "redirect:/admin/main";
        }catch (UnknownAccountException ukactException){
            //用戶不存在異常
            ukactException.printStackTrace();
            map.addAttribute("err_msg","用戶不存在");
            return "login";
        }catch (IncorrectCredentialsException credentialExctption){
            credentialExctption.printStackTrace();
            map.addAttribute("err_msg","密碼錯誤");
            return "login";
        }catch (Exception e){
            e.printStackTrace();
            map.addAttribute("err_msg","服務(wù)器錯誤,請重試");
            return "login";
        }
    }
}

其他

1.thymeleaf中使用shiro標簽的支持

依賴坐標:

<dependency>
    <groupId>com.github.theborakompanioni</groupId>
    <artifactId>thymeleaf-extras-shiro</artifactId>
    <version>2.0.0</version>
</dependency>

配置支持:

@Bean
public ShiroDialect shiroDialect(){
    return new ShiroDialect();
}

2.request判斷ajax請求

//通過頭X-Requested-With=XMLHttpRequest來判斷
request.getHeader("X-Requested-With");

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 黄色片在线观看网站 | 免费一区 | 亚洲手机看片 | 日日爽夜夜爽 | 久久免费在线 | 大陆一级毛片 | 91精品国产91久久久久 | 我要操影院 | 亚洲综合一区二区三区 | 亚洲一区二区三区一品精 | 亚洲精品123区在线观看 | 视频二区 中文字幕 欧美 | 久久精品最新免费国产成人 | 久草综合视频 | 欧美日韩视频在线成人 | 国产精品网站 夜色 | 香蕉视频成人在线观看 | 在线成人国产 | 97久久久久国产精品嫩草影院 | 久久国产精品最新一区 | 操操操综合网 | 91探花在线视频 | 欧美一级片网站 | 久久色播 | 免费在线观看黄色毛片 | 国产精品一区二区欧美视频 | 欧美国产激情二区三区 | 青草青草久热精品视频99 | 91资源在线视频 | 国内精品自在欧美一区 | 日本3p视频在线看高清 | 久久精品免视看国产成人2021 | 久久99精品一久久久久久 | 波多野结衣视频一区二区 | 精品久久久久久久久久香蕉 | 日本 国产 欧美 | 99精品高清视频一区二区 | 俺去鲁婷婷六月色综合 | 久久久久久97 | 中文字幕在线观看不卡 | 亚洲精品影视 |