昨天,我在《Shiro系列之Shiro+Mysql实现用户认证(Authentication)》中简单介绍了使用Shiro+Mysql实现用户认证的功能,今天我们继续使用其中的示例,讲解一下如何实现用户授权。
所谓授权,就是判断当前用户具体哪些权限,能够执行哪些操作,或是访问哪些资源(Web中的URL,又或是页面上的一个按钮,一个编辑框等都可以视为资源)。因此我们需要数据表来存储这些资源信息,以及用户、角色和资源的分配关系。
上文中已经创建了用户表,在本文中我们需要再创始角色表、资源表,以及用户和角色、角色和资源之间的关系表。这里仅为了需要让测试程序跑通,所以字段都很简单,在使用中可根据实际情况对字段进行增加。
CREATE TABLE `sec_role` ( `role_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `role_name` varchar(64) COLLATE utf8_bin DEFAULT NULL, `created_time` datetime DEFAULT NULL, `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`role_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `sec_permission` ( `permission_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `permission_name` varchar(64) COLLATE utf8_bin DEFAULT NULL, `created_time` datetime DEFAULT NULL, `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`permission_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `sec_user_role` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned DEFAULT NULL, `role_id` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `sec_role_permission` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `permission_id` int(10) unsigned NOT NULL, `role_id` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
建好表之后,我们就需要为JdbcRealm对象指定用户、角色和权限的查询语句。在Shiro的配置文件中添加如下代码:
[main] dataSource=org.springframework.jdbc.datasource.DriverManagerDataSource dataSource.driverClassName=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://127.0.0.1:3306/etao_java dataSource.username=root dataSource.password=cope9020 jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm jdbcRealm.permissionsLookupEnabled = true jdbcRealm.dataSource=$dataSource #用户认证(登录)查询语句,以用户名为查询条件 jdbcRealm.authenticationQuery = SELECT password FROM sec_user WHERE user_name = ? #用户角色查询语句,以用户名为查询条件,判断用户是否拥有某个角色 jdbcRealm.userRolesQuery = SELECT role_name from sec_user_role left join sec_role using(role_id) left join sec_user using(user_id) WHERE user_name = ? #资源许可查询语句,以角色名称为查询条件,判断角色是否拥有某个资源的许可 jdbcRealm.permissionsQuery = SELECT permission_name FROM sec_role_permission left join sec_role using(role_id) left join sec_permission using(permission_id) WHERE role_name = ?
关于这三条查询语句,在这里多说两句,小伙伴们不要嫌我啰嗦。
- 用户认证的查询语句中,只需要以用户名为查询条件,查询出密码字段即可,如果您在select后面使用了星号(*)或是查询字段多于一个,都无法通过用户认证。
- 用户角色查询语句,以用户名为查询条件,通过多表关联,查询出角色名字段即可,不可使用星号,或多个字段
- 资源许可查询语句,以角色名为查询条件,通过多表关联,查询出资源名称字段即可,不可使用星号,或多个字段
配置文件修改好之后,就可以编写测试代码了。
public class JdbcRealmTest { @Test public void test() { // 1.获取SecurityManager工厂,此处使用ini配置文件初始化SecurityManager Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc-realm.ini"); // 2.获取SecurityManager实例,并绑定到SecurityUtils SecurityManager sm = factory.getInstance(); SecurityUtils.setSecurityManager(sm); // 3.得到Subject Subject subject = SecurityUtils.getSubject(); // 4.创建用户登录凭证 UsernamePasswordToken token = new UsernamePasswordToken("chris.mao@emerson.com", "chrismao"); token.setRememberMe(true); // 5.登录,如果登录失败会抛出不同的异常,根据异常输出失败原因 try { subject.login(token); // 6.判断是否成功登录 assertEquals(true, subject.isAuthenticated()); System.out.println("登录成功!!"); // 判断用户是否拥有某个角色 assertEquals(true, subject.hasRole("admin")); // 使用Shiro自带的断言判断用户是否有被授权 subject.checkRole("manager"); subject.checkPermission("create_user1"); // 7.注销用户 subject.logout(); } catch (IncorrectCredentialsException e) { System.out.println("登录密码错误. Password for account " + token.getPrincipal() + " was incorrect."); } catch (ExcessiveAttemptsException e) { System.out.println("登录失败次数过多"); } catch (LockedAccountException e) { System.out.println("帐号已被锁定. The account for username " + token.getPrincipal() + " was locked."); } catch (DisabledAccountException e) { System.out.println("帐号已被禁用. The account for username " + token.getPrincipal() + " was disabled."); } catch (ExpiredCredentialsException e) { System.out.println("帐号已过期. the account for username " + token.getPrincipal() + " was expired."); } catch (UnknownAccountException e) { System.out.println("帐号不存在. There is no user with username of " + token.getPrincipal()); } catch (UnauthorizedException e) { System.out.println("您没有得到相应的授权!" + e.getMessage()); } } }
这里使用了Shiro自带的断言,用于判断用户是否有被授权,如果没有被授权,会抛出UnauthorizedException异常,小伙伴们可以捕捉此异常进行相应的处理。
相关推荐
2. **Shiro框架**:Apache Shiro是一款轻量级的安全框架,它提供了身份验证(Authentication)、授权(Authorization)以及会话管理(Session Management)等功能。在这个系统中,Shiro主要用于用户登录验证、权限...
Apache Shiro是一个强大的安全框架,主要用于身份验证(Authentication)、授权(Authorization)、会话管理和加密(Cryptography)。在这个项目中,Shiro被用来实现用户登录验证、角色和权限的控制,以及安全的会话...
首先,Shiro的五个核心概念是主体(Subject)、身份认证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管理(Session Management)。在数据库中,我们需要为这些功能创建对应的表来存储...
Apache Shiro是一个强大的Java安全框架,它提供了身份验证(Authentication)、授权(Authorization)以及会话管理(Session Management)等功能,可以方便地与各种应用程序结合,包括Web应用。在这个"Shiro Mysql ...
Apache Shiro是一个强大的Java安全框架,它提供了身份验证(Authentication)、授权(Authorization)以及会话管理(Session Management)等功能,广泛应用于Web应用和独立的Java应用中。在本示例中,我们将深入探讨...
标题 "springboot shiro" 描述了一种使用Spring Boot集成Apache Shiro进行权限管理与...通过分析这些文件,你可以深入了解如何在实际项目中整合Spring Boot、Shiro和MySQL数据库,实现一个完整的用户认证和授权系统。
总结,整合Shiro、Thymeleaf和MySQL,能够在Spring Boot应用中构建出一套完整的用户认证和授权体系。Shiro提供了安全控制的基本框架,Thymeleaf使页面渲染更加灵活,而MySQL作为持久化存储,确保了数据的安全性。...
在使用Shiro时,可以连接多个用户数据源,如Oracle用户库和MySQL用户库,并将它们整合为单一的复合用户视图。Shiro的架构设计确保了它可以在多种不同的应用程序环境下工作,如命令行应用程序到大型群集Web应用程序,...
Spring Security或Apache Shiro可以用于系统的权限控制,实现用户认证(Authentication)和授权(Authorization)。 六、前端技术 尽管描述中未明确指出,但通常此类系统会使用HTML、CSS和JavaScript进行界面开发,...
- **授权(Authorization)**:确定用户是否有权限执行某个操作。 - **会话管理(Session Management)**:跟踪用户的在线状态。 - **加密(Cryptography)**:对敏感数据进行加密,保护信息安全。 2. **整合...
授权(Authorization)部分,Shiro允许你在数据库中存储角色和权限信息,然后根据这些信息决定用户是否被授权访问特定资源。你可以自定义SQL查询来获取用户的角色和权限,如上述配置中的`setUserRolesQuery`和`...
通过学习这个项目,开发者可以深入了解Spring Boot与Shiro的结合使用,掌握如何在实际项目中实现用户认证和权限管理。同时,由于源码清晰,对于初学者来说,这是一个很好的学习和实践平台,有助于提升Java Web开发...
授权(Authorization):验证某个已认证的用户是否拥有访问某个资源或执行某个操作的权限。这通常涉及到角色和权限的管理。 加密(Cryptography):Shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、...
在Java中,这通常涉及到身份验证(Authentication)和授权(Authorization)两个步骤。 身份验证是确认用户身份的过程,而授权则是决定已验证的用户可以执行哪些操作。在MySQL中,我们可以使用内置的用户管理和权限...
2. 授权(Authorization):在Shiro中,授权是关于确定用户是否有权限执行特定操作或访问特定资源的过程。Shiro 支持角色(Role)和权限(Permission)的概念。你可以为用户分配角色,每个角色关联一组权限。通过...
Apache Shiro是一款轻量级的安全框架,主要用于身份验证(Authentication)、授权(Authorization)和会话管理(Session Management)。在点餐系统中,Shiro能有效保障用户登录的安全性,防止未授权访问。 1. 身份...
系统可能集成了Spring Security或Apache Shiro等安全框架,用于处理用户认证(Authentication)和授权(Authorization)。通过这些框架,可以实现角色权限分配,如普通学生只能查看和选择课程,教师可以发布课程,...
8. **安全机制**:项目可能集成Spring Security或Apache Shiro等安全框架,实现用户认证(Authentication)和授权(Authorization),保护系统资源不被非法访问。 9. **异常处理**:系统可能包含全局异常处理机制,...
通过Spring Security,我们可以方便地实现用户认证(Authentication)和授权(Authorization)。认证涉及用户身份的验证,而授权则决定验证后的用户可以访问哪些资源。 1. 配置Spring Security:首先需要在项目中...
- **定义**: Spring Security 是一款基于 Spring 框架的身份认证(Authentication)与用户授权(Authorization)的安全框架,提供了全面的Web应用程序安全性解决方案。 - **核心技术**: 使用了 Servlet 过滤器、IOC...