更多信息,请参考:http://www.cxyeye.com/
Apache Shiro 是什么?
Shiro 是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可为任何应用提供安全保障
为什么要使用它?
1:登陆验证是WEB应用中非常常见的一个功能;
2:对于授权,大部分应用停留在判断session为空跳回登录首页的阶段,正确的做法是能根据用户的较色权限,授予不同用户不同目录的访问权限;
3:客户端和服务端的数据传递,以及服务器之间的调用,敏感信息需要进行加密。目前很多应用甚至没有这个功能;
4:验证,授权,加密,最好有一个统一的平台去完成这些功能,shiro就是这样一个解决方案;你可以自己去实现这些功能,但有成熟的开源的产品为什么不用呢?
Apache Shiro 的一些核心思想
1:配置文件定义的内容
[main] ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource ds.serverName = 127.0.0.1 ds.user = root ds.password = root ds.databaseName = test ds.url = jdbc:mysql://127.0.0.1:3306/test jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm jdbcRealm.permissionsLookupEnabled = true jdbcRealm.authenticationQuery = SELECT password FROM ho_user WHERE name = ? jdbcRealm.userRolesQuery = SELECT role FROM ho_user WHERE name = ? jdbcRealm.permissionsQuery = SELECT permission FROM ho_user WHERE name = ? jdbcRealm.dataSource = $ds authc.loginUrl = /common/login.jsp perms.unauthorizedUrl = /common/login.jsp roles.unauthorizedUrl = /common/login.jsp [urls] /action/* = authc /admin/**=authc,perms[high] /system/**=authc,perms[high]
每个框架都会有自己的一些配置文件,shiro的配置是基于key-value。
1:定义验证用户的SQL
2:定义获取用户角色的SQL
3:定义获取用户权限的SQL
4:定义验证不通过时返回的页面
5:定义需要授权的目录以及授权条件
2: 验证用户登陆的异常思想
try { currentUser.login(token); } catch (IncorrectCredentialsException ice) { … } catch (LockedAccountException lae) { … } … catch (AuthenticationException ae) {… }
通过异常机制判断用户的验证结果
3:哈希和加密的简单实用,哈希和加密用于确保数据传输过程中对敏感数据的保护。当保护需要转换回来时需要用加密,反之用哈希;保护不仅对字符有效,对文件二进制的数据一样有效。
哈希是不可逆的,哈希的结果长度无关跟原值无关 (例如文件的哈希)
String hex = new Md5Hash(myFile).toHex();
加密是可逆的;加密随着原值长度线性增长。
AesCipherService cipherService = new AesCipherService(); cipherService.setKeySize(256); //创建一个测试密钥: byte[] testKey = cipherService.generateNewKey(); //加密文件的字节: byte[] encrypted = cipherService.encrypt(fileBytes, testKey);
4: web支持(一般框架都是接触这种方式,servlet或者filter)
<filter> <filter-name>ShiroFilter</filter-name> <filter-class> org.apache.shiro.web.servlet.IniShiroFilter </filter-class> <!-- 没有init-param属性就表示从classpath:shiro.ini装入INI配置 --> </filter> <filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
有一点可贵的是,shiro的会话管理,它可以在系统的任何位置,通过工厂的方式,得到当前对话的session
Session session = subject.getSession();
session.getAttribute("key", someValue);
总结
Shiro为解决下列问题(我喜欢称它们为应用安全的四要素)提供了保护应用的API:
认证 - 用户身份识别,常被称为用户“登录”;
授权 - 访问控制;
密码加密 - 保护或隐藏数据防止被偷窥;
会话管理 - 每用户相关的时间敏感的状态
以下是对安全性的一些认识:
1:目录是否有严格的访问限制
2:验证码是否符合标准,会话超时时间,注销session的清空,登录用户暴力测试的锁定;
3:用户名,密码等敏感信息的HTTPS 加密传输
4:文件上传下载的 类型限制;目录限制安全
5:系统配置文件,日志安全
摘录:
让Apache Shiro保护你的应用 http://www.infoq.com/cn/articles/apache-shiro
Apache Shiro在Web中的应用 http://blog.csdn.net/stuqbx/article/details/7178406
apache shiro 管理用户权限与数据库交互 http://www.open-open.com/doc/view/453bc4f22d83435ab2bfb6768c41ac90
Apache Shiro 使用手册 http://www.open-open.com/doc/view/8cf6f10a10d0497cbcbc3a9931354c62
更多信息,请参考:http://www.cxyeye.com/