Shiro使用总结

本文介绍了Shiro在项目中的应用,包括身份验证和权限管理两大功能。详细列举了Shiro前端功能API,如验证用户身份、获取用户角色及权限等,并提供了前后端使用示例。

Shiro已经添加到项目中,现阶段管理两个功能:
1、身份验证;(已经能够满足现阶段需求)
2、权限管理;

权限管理,需要在界面中加一些标签,后台角色、资源的管理也需要整理好,然后在前端添加管理。
1、后端使用示例如下:
Subject currentUser = SecurityUtils.getSubject(); if(currentUser.isPermitted("user")){ }
2、前端使用示例如下:
#if($shiro.hasRole("admin")) <a href="#"> &nbsp; <span>管理员</span> </a> #end
3、前端功能API
一、$shiro.isAuthenticated()
功能说明:验证是否为已认证通过的用户,不包含已记住的用户,这是与 isUser 标签方法的区别所在。
参数:无
返回值:Boolean

二、$shiro.isNotAuthenticated()
功能说明:验证是否为未认证通过用户,与 isAuthenticated 标签相对应,与 isGuest 标签的区别是,该标签包含已记住用户。
参数:无
返回值:Boolean

三、$shiro.isGuest()
功能说明:验证当前用户是否为“访客”,即未认证(包含未记住)的用户。
参数:无
返回值:Boolean

四、$shiro.isUser()
功能说明:验证当前用户是否认证通过或已记住的用户。
参数:无
返回值:Boolean

五、$shiro.getPrincipal()
功能说明:获取当前用户 Principal。
参数:无
返回值:Object

六、$shiro.getPrincipalProperty(String property)
功能说明:获取当前用户 Principal。
参数:String property 用户属性
返回值:Object

七、$shiro.hasRole(String role)
功能说明:验证当前用户是否属于该角色 。
参数:String role 角色名称
返回值:Boolean

八、$shiro.lacksRole(String role)
功能说明:验证当前用户是否不属于该角色,与 hasRole 标签逻辑相反。
参数:String role 角色名称
返回值:Boolean

九、$shiro.hasAnyRoles(String roleNames, String delimeter)
功能说明:验证当前用户是否属于以下任意一个角色。
参数:String roleNames 用户角色列表,以 delimeter 分割
String delimeter 用户角色分隔符
返回值:Boolean

十、$shiro.hasAnyRoles(String roleNames)
功能说明:验证当前用户是否属于以下任意一个角色。
参数:String roleNames 用户角色列表,以 “," 分割
返回值:Boolean

十一、$shiro.hasAnyRoles(Collection roleNames)
功能说明:验证当前用户是否属于以下任意一个角色。
参数:Collection roleNames 用户权限角色
返回值:Boolean

十二、$shiro.hasAnyRoles(String[] roleNames)
功能说明:验证当前用户是否属于以下任意一个角色。
参数:String[] roleNames 用户权限角色
返回值:Boolean

十三、$shiro.hasPermission(String permission)
功能说明:验证当前用户是否拥有指定权限
参数:String permission 权限名称
返回值:Boolean

十四、$shiro.lacksPermission(String permission)
功能说明:验证当前用户是否不拥有指定权限,与 hasPermission 逻辑相反。
参数:String permission 权限名称
返回值:Boolean

十五、$shiro.hasAnyPermissions(String permissions, String delimeter)
功能说明:验证当前用户是否拥有以下任意一个权限。
参数:String permissions 权限名称列表,以 delimeter 分割
String delimeter 用户权限分隔符
返回值:Boolean

十六、$shiro.hasAnyPermissions(String permissions)
功能说明:验证当前用户是否拥有以下任意一个权限。
参数:String permissions 权限名称列表,以 “," 分割
返回值:Boolean

十七、$shiro.hasAnyPermissions(Collection permissions)
功能说明:验证当前用户是否拥有以下任意一个权限。
参数:Collection 权限名称列表
返回值:Boolean

十八、$shiro.hasAnyPermissions(String[] permissions)
功能说明:验证当前用户是否拥有以下任意一个权限。
参数:String[] 权限名称列表
返回值:Boolean


时间: 2016年1月25日 (周一) 15:45

项目权限管理,已经添加到系统中(权限缓存的保存位置待优化)
使用方法:
1、界面上设置
<div class="list-opt"> <div class="nk-button-group"> #if($shiro.hasPermission("project_Add")) <button v-on:click="addProject" class="nk-button">新增</button> #end #if($shiro.hasPermission("project_Setting")) <button v-on:click="settingProject" class="nk-button">项目设置</button> #end #if($shiro.hasPermission("project_WorkOrder")) <button v-on:click="woMgr" class="nk-button">工单管理</button> #end </div>
2、后台设置
200693-20161201143057443-1278072069.jpg

资源的Code和权限相同,然后把资源分配给角色即可;
有需要添加的资源,数据添加好后,发一份给我,或者自行写到初始化脚本中(initData.txt)

<think>我们正在讨论Shiro框架的使用方法和示例代码。根据引用,Shiro是一个安全框架,提供认证、授权、会话管理等功能。下面将按照步骤介绍Shiro的基本使用,包括环境配置、认证、授权、会话管理以及集成SpringBoot。###1.添加Shiro依赖首先,在项目中添加Shiro依赖。如果使用Maven,在`pom.xml`中添加:```xml<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.10.0</version></dependency>```对于SpringBoot项目,通常还需要集成Spring的Shiro支持:```xml<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.10.0</version></dependency>```###2.配置ShiroShiro的核心配置通常通过`shiro.ini`文件或Java配置类完成。这里以`shiro.ini`为例:在`src/main/resources`目录下创建`shiro.ini`:```ini[users]#格式:用户名=密码,角色admin=admin123,adminuser=user123,user[roles]#角色权限定义:admin角色拥有所有权限(*)admin=*#user角色拥有对用户资源的访问权限user=user:read,user:write```###3.认证(Authentication)认证是验证用户身份的过程。以下是一个简单的认证示例:```javaimportorg.apache.shiro.SecurityUtils;importorg.apache.shiro.authc.*;importorg.apache.shiro.config.IniSecurityManagerFactory;importorg.apache.shiro.mgt.SecurityManager;importorg.apache.shiro.subject.Subject;importorg.apache.shiro.util.Factory;publicclassAuthenticationExample{publicstaticvoidmain(String[]args){//1.初始化SecurityManager(从ini文件创建)Factory<SecurityManager>factory=newIniSecurityManagerFactory("classpath:shiro.ini");SecurityManagersecurityManager=factory.getInstance();SecurityUtils.setSecurityManager(securityManager);//2.获取当前用户SubjectcurrentUser=SecurityUtils.getSubject();//3.模拟用户登录if(!currentUser.isAuthenticated()){//创建令牌(用户输入的用户名和密码)UsernamePasswordTokentoken=newUsernamePasswordToken("admin","admin123");try{//登录currentUser.login(token);System.out.println("登录成功!");}catch(UnknownAccountExceptionuae){System.out.println("用户名不存在");}catch(IncorrectCredentialsExceptionice){System.out.println("密码错误");}catch(LockedAccountExceptionlae){System.out.println("账户已锁定");}catch(AuthenticationExceptionae){System.out.println("登录失败");}}//4.登出currentUser.logout();}}```###4.授权(Authorization)授权是控制用户访问权限的过程。Shiro支持基于角色和基于权限的授权。```java//续上例:认证成功后,进行授权检查if(currentUser.hasRole("admin")){System.out.println("拥有admin角色");}else{System.out.println("没有admin角色");}//检查权限if(currentUser.isPermitted("user:write")){System.out.println("拥有user:write权限");}else{System.out.println("没有user:write权限");}```###5.集成SpringBoot在SpringBoot中集成Shiro,可以创建Shiro配置类:```javaimportorg.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;importorg.apache.shiro.spring.web.config.ShiroFilterChainDefinition;importorg.apache.shiro.web.mgt.DefaultWebSecurityManager;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassShiroConfig{//配置SecurityManager@BeanpublicDefaultWebSecurityManagersecurityManager(MyRealmrealm){DefaultWebSecurityManagersecurityManager=newDefaultWebSecurityManager();securityManager.setRealm(realm);returnsecurityManager;}//配置Shiro过滤器链@BeanpublicShiroFilterChainDefinitionshiroFilterChainDefinition(){DefaultShiroFilterChainDefinitionchain=newDefaultShiroFilterChainDefinition();//配置访问规则:例如,/login无需认证,其他路径需要认证chain.addPathDefinition("/login","anon");chain.addPathDefinition("/logout","logout");chain.addPathDefinition("/**","authc");returnchain;}}```自定义Realm(用于认证和授权):```javaimportorg.apache.shiro.authc.*;importorg.apache.shiro.authz.AuthorizationInfo;importorg.apache.shiro.authz.SimpleAuthorizationInfo;importorg.apache.shiro.realm.AuthorizingRealm;importorg.apache.shiro.subject.PrincipalCollection;publicclassMyRealmextendsAuthorizingRealm{//认证@OverrideprotectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{Stringusername=(String)token.getPrincipal();//模拟从数据库获取用户信息if("admin".equals(username)){returnnewSimpleAuthenticationInfo(username,"admin123",getName());}elseif("user".equals(username)){returnnewSimpleAuthenticationInfo(username,"user123",getName());}thrownewUnknownAccountException("用户不存在");}//授权@OverrideprotectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){Stringusername=(String)principals.getPrimaryPrincipal();SimpleAuthorizationInfoinfo=newSimpleAuthorizationInfo();//模拟从数据库获取角色和权限if("admin".equals(username)){info.addRole("admin");info.addStringPermission("*");}elseif("user".equals(username)){info.addRole("user");info.addStringPermission("user:read");info.addStringPermission("user:write");}returninfo;}}```###6.使用注解进行权限控制在SpringBoot中,可以使用Shiro的注解进行方法级别的权限控制:```javaimportorg.apache.shiro.authz.annotation.RequiresRoles;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassUserController{@RequiresRoles("admin")//需要admin角色@GetMapping("/admin")publicStringadmin(){return"AdminPage";}@RequiresRoles("user")//需要user角色@GetMapping("/user")publicStringuser(){return"UserPage";}}```###7.会话管理Shiro提供了会话管理功能,可以获取当前用户的会话信息:```javaSubjectcurrentUser=SecurityUtils.getSubject();Sessionsession=currentUser.getSession();session.setAttribute("key","value");Stringvalue=(String)session.getAttribute("key");```###总结通过以上步骤,我们实现了Shiro的基本功能:1.**认证**:验证用户身份2.**授权**:控制用户访问权限3.**会话管理**:管理用户会话4.**集成SpringBoot**:简化配置Shiro的灵活性和易用性使其成为Java安全领域的重要选择[^1][^2]。§§相关问题§§1.如何在Shiro中实现密码加密?2.Shiro如何处理分布式会话?3.Shiro与SpringSecurity的主要区别是什么?4.如何自定义Shiro的权限验证规则?</think>### Shiro 框架使用教程与示例代码 Shiro 是一个强大且易用的 Java 安全框架,提供认证、授权、加密和会话管理等功能。以下是完整使用指南: --- #### 1. **添加依赖** 在 `pom.xml` 中添加核心依赖: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.10.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.10.0</version> </dependency> ``` --- #### 2. **基础配置(INI 方式)** 创建 `shiro.ini` 配置文件: ```ini [main] # 安全管理器配置 securityManager = org.apache.shiro.mgt.DefaultSecurityManager securityManager.realm = $jdbcRealm # JDBC 域配置 jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm jdbcRealm.authenticationQuery = SELECT password FROM users WHERE username = ? jdbcRealm.userRolesQuery = SELECT role_name FROM user_roles WHERE username = ? [urls] # URL 权限规则 /login = anon /admin/** = authc, roles[admin] /user/** = authc, roles[user] /** = authc ``` --- #### 3. **Spring Boot 集成** ```java @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shiroFilter() { ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean(); filter.setSecurityManager(securityManager()); filter.setLoginUrl("/login"); filter.setSuccessUrl("/home"); // 动态配置权限规则 Map<String, String> chainMap = new LinkedHashMap<>(); chainMap.put("/logout", "logout"); chainMap.put("/admin/**", "authc, roles[admin]"); filter.setFilterChainDefinitionMap(chainMap); return filter; } @Bean public SecurityManager securityManager() { DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setRealm(jdbcRealm()); return manager; } @Bean public Realm jdbcRealm() { JdbcRealm realm = new JdbcRealm(); realm.setDataSource(dataSource); realm.setAuthenticationQuery("SELECT password FROM users WHERE username = ?"); realm.setUserRolesQuery("SELECT role_name FROM user_roles WHERE username = ?"); return realm; } } ``` --- #### 4. **认证与授权示例** **用户登录认证:** ```java Subject currentUser = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("admin", "password123"); try { currentUser.login(token); // 认证成功 System.out.println("用户ID: " + currentUser.getPrincipal()); } catch (AuthenticationException e) { System.out.println("登录失败: " + e.getMessage()); } ``` **权限检查:** ```java if (currentUser.hasRole("admin")) { System.out.println("拥有管理员权限"); } if (currentUser.isPermitted("user:delete")) { System.out.println("允许删除用户"); } ``` **注解式权限控制:** ```java @RequiresRoles("admin") @GetMapping("/admin/dashboard") public String adminDashboard() { return "管理员面板"; } @RequiresPermissions("user:create") @PostMapping("/users") public ResponseEntity createUser() { // 创建用户逻辑 } ``` --- #### 5. **会话管理** ```java // 获取会话 Session session = currentUser.getSession(); session.setAttribute("login
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值