官网:https://shiro.apache.org/

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

最新文章

  1. [C#] 简单的 Helper 封装 -- RegularExpressionHelper
  2. Linux学习笔记(6)-文件I/O
  3. Oracle 如何对时间进行简单加减运算
  4. Vi/Vim查找替换使用方法
  5. HDU 4278 Faulty Odometer 8进制转10进制
  6. SharePoint服务器将连接配置数据库的连接字符串保存在什么地方?
  7. Optimizing Linux network TCP/IP kernel parameters
  8. 与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成
  9. Sql数据类型转换
  10. mysql 创建用户与授权、修改密码
  11. WinForm响应式布局设计实践
  12. Linq基础+Lambda表达式对数据库的增删改及简单查询
  13. Android--多线程之Looper
  14. Android下的软件合集
  15. Lodop打印设计(PRINT_DESIGN)介绍
  16. Poj 1659.Frogs&#39; Neighborhood 题解
  17. 深入理解JVM(1)——JVM内存模型
  18. Android活动和碎片的生命周期及addToBackStack()方法
  19. [01] 浅谈RESTful风格的API
  20. cocos2d-x 保持屏幕点亮及自动变灰

热门文章

  1. 【Tsinsen A1039】【bzoj2638】黑白染色 (BFS树)
  2. 洛谷CF1071E Rain Protection(计算几何,闵可夫斯基和,凸包,二分答案)
  3. 洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)
  4. 各种“地”—— 各种“GND”
  5. springboot jar包运行中获取资源文件
  6. CodeForces - 589A(字符串处理)
  7. springAop 使用@Around,@After等注解时,代码运行两边的问题
  8. LINQ的增删改查写法&amp;&amp;组合查询
  9. listview 样式 LVS_REPORT 与 LVS_EDITLABELS 编辑单元格时,当前行第一列内容不显示
  10. Day22 常用模块01