1. 下载
在非Web环境的独立应用中使用Shiro时,只需要shiro-core组件。
在Maven项目中的依赖配置如下:
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency> <!-- Shiro uses SLF4J for logging. We'll use the 'simple' binding in this example app. See http://www.slf4j.org for more info. --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.6.1</version> </dependency>
特别地!Shiro使用了日志框架slf4j,因此需要对应配置指定的日志实现组件,如:log4j,logback等。
在此,使用slf4j的简单日志实现slf4j-simple。
2. 数据源配置
在Shiro中,Realm定义了访问数据的方式,用来连接不同的数据源,如:LDAP,关系数据库,配置文件等等。
Realm类图:
也就是说,可以根据实际需求及应用的权限管理复杂度灵活选择指定数据源。
在此,以org.apache.shiro.realm.text.IniRealm为例,具体配置如下:
shiro.ini:
# ============================================================================= # Tutorial INI configuration # # Usernames/passwords are based on the classic Mel Brooks' film "Spaceballs" :) # ============================================================================= # ----------------------------------------------------------------------------- # Users and their (optional) assigned roles # username = password, role1, role2, ..., roleN # ----------------------------------------------------------------------------- [users] root = secret, admin guest = guest, guest presidentskroob = 12345, president darkhelmet = ludicrousspeed, darklord, schwartz lonestarr = vespa, goodguy, schwartz # ----------------------------------------------------------------------------- # Roles with assigned permissions # roleName = perm1, perm2, ..., permN # ----------------------------------------------------------------------------- [roles] admin = * schwartz = lightsaber:* goodguy = winnebago:drive:eagle5
选择了数据源,现在开始使用Shiro进行认证和访问授权控制。
3. 认证
在Shiro中,认证即执行用户登录,读取指定Realm连接的数据源,以验证用户身份的有效性与合法性。
String name = "lonestarr"; String pass = "vespa"; Subject currentUser = SecurityUtils.getSubject(); if(!currentUser.isAuthenticated()) { UsernamePasswordToken token = new UsernamePasswordToken(name, pass); token.setRememberMe(true); try { currentUser.login(token); } catch (UnknownAccountException e) { logger.error(String.format("user not found: %s", name), e); } catch(IncorrectCredentialsException e) { logger.error(String.format("user: %s pwd: %s error", name, pass), e); } catch (ConcurrentAccessException e) { logger.error(String.format("user has been authenticated: %s", name), e); } catch (AuthenticationException e) { logger.error(String.format("account except: %s", name), e); } } logger.info( "User [" + currentUser.getPrincipal() + "] logged in successfully." );
4. 访问授权
在Shiro中,访问授权即验证用户是否具备执行指定操作的权限(角色或权限验证)。
特别地!在执行访问授权验证之前,必须执行用户认证。
String role = "schwartz"; if(currentUser.hasRole(role)) { logger.info(String.format("用户: %s 属于角色:%s", name, role)); }else{ logger.error(String.format("用户: %s 不属于角色:%s", name, role)); } String perm = "lightsaber:cc"; if(currentUser.isPermitted(perm)) { logger.info(String.format("用户: %s 拥有权限:%s", name, perm)); }else { logger.error(String.format("用户:%s 没有权限:%s", name, perm)); }
5. 完整示例
详见:https://git.oschina.net/cchanghui/test-shirocli.git