资源描述
Shiro1.1.0开发配置文档
在NetBeans7.0中使用Shiro1.1.0的实例
建立一个java应用程序项目,项目及文件结构如图:
注意以下几点:
1、导入与Shiro相关的库,如图所示几个jar包,如运行时出现log4j相关的错误,则可能是log4j相关的包不正确;
2、shiro.ini文件的路径问题,应放在项目根路径下,内容为:
view plain
1. [users]
2. zwx=zavens
3、log4j.properties文件为可选文件,建议自己设置log4j属性,内容为:
view plain
1. log4j.rootLogger=TRACE, stdout
2.
3. log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender
4. log4j.appender.stdout.File=C:/log4j/log.txt
5. log4j.appender.stdout.Encoding=GBK
6. log4j.appender.stdout.Threshold=DEBUG
7. log4j.appender.stdout.DatePattern='.'yyyy-MM-dd
8. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
9. log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n
10.
11. .sf.ehcache=WARN
12. log4j.logger.org.apache=WARN
13. log4j.logger.org.quartz=WARN
14. log4j.logger.org.apache.shiro=TRACE
15. log4j.logger.org.apache.shiro.util.ThreadContext=INFO
log4j.properties详细配置,请看:log4j.properties资源配置文件
4、shiroAp.java内容:
view plain
1. package shiroap;
2.
3. import java.io.File;
4. import java.io.IOException;
5. import org.apache.shiro.SecurityUtils;
6. import org.apache.shiro.authc.UsernamePasswordToken;
7. import org.apache.shiro.config.IniSecurityManagerFactory;
8. import org.apache.shiro.mgt.SecurityManager;
9. import org.apache.shiro.subject.Subject;
10. import org.apache.shiro.util.Factory;
11.
12. public class ShiroAp {
13.
14. public static void main(String[] args) throws IOException {
15. Factory<SecurityManager> factory = new IniSecurityManagerFactory("shiro.ini");
16. SecurityManager sm=factory.getInstance();
17. SecurityUtils.setSecurityManager(sm);
18. Subject sub=SecurityUtils.getSubject();
19. if(sub.isAuthenticated()){
20. System.out.println("已登录,SESSION:" + sub.getSession());
21. }
22. System.out.println("未登录,SESSION:" + sub.getSession());
23. UsernamePasswordToken at=new UsernamePasswordToken ("zwx","zavens");
24. try{
25. sub.login(at);
26. }catch(Exception e){
27. System.out.println("验证没通过!");
28. }
29. if(sub.isAuthenticated()){
30. System.out.println("已登录,SESSION:" + sub.getSession());
31. }
32. }
33. }
实例下载
shiro配置文件路径问题的探索
Shiro是一个简单、开源且强大的安全管理框架,是实现单点登录的理想选择,常被应用于java web应用中。
在java web中使用shiro时,可以使用一个INI文件对shiro进行配置,这仅需要在web.xml中配置一下IniShiroFilter的一个参数configPath,然而在配置时,文件的路径问题却出来了,例如,我将shiro.ini文件放在/WEB-INF文件夹下面,然后再web.xml中配置如下:
view plain
1. <filter>
2. <filter-name>ShiroFilter</filter-name>
3. <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
4. <init-param>
5. <param-name>configPath</param-name>
6. <param-value>/WEB-INF/shiro.ini</param-value>
7. </init-param>
8. </filter>
9. <filter-mapping>
10. <filter-name>ShiroFilter</filter-name>
11. <url-pattern>/*</url-pattern>
12. </filter-mapping>
在部署时,会提示找不着shiro.ini文件。注意,我使用的环境是netbeans 7.0.1+ glassfish 3.1 。
究其原因,我直接找到了IniShiroFilter的源码,其在初始化时,会调用ini(),ini()调用configure(),configure()又调用loadIniFromConfig()或者loadIniFromPath(),其中前者对应IniShiroFilter的另一个参数config,后者对应参数configPath,继续查loadIniFromPath(),发现它又调用convertPathToIni(),convertPathToIni()接着又调用ini.loadFromPath(),至此跳出了IniShiroFilter的函数调用;继续查ini类,打开其源码,找到loadFromPath(),它又调用ResourceUtils.getInputStreamForPath(),找到ResourceUtils类的getInputStreamForPath()方法,源码如下:
view plain
1. public static InputStream getInputStreamForPath(String resourcePath) throws IOException {
2.
3. InputStream is;
4. if (resourcePath.startsWith(CLASSPATH_PREFIX)) {
5. is = loadFromClassPath(stripPrefix(resourcePath));
6.
7. } else if (resourcePath.startsWith(URL_PREFIX)) {
8. is = loadFromUrl(stripPrefix(resourcePath));
9.
10. } else if (resourcePath.startsWith(FILE_PREFIX)) {
11. is = loadFromFile(stripPrefix(resourcePath));
12.
13. } else {
14. is = loadFromFile(resourcePath);
15. }
16.
17. if (is == null) {
18. throw new IOException("Resource [" + resourcePath + "] could not be found.");
19. }
20.
21. return is;
22. }
web.xml中配置的configPath参数的路径值被传递到了resourcePath参数,却发现其分3类情况处理,分别是CLASSPATH、URL、FILE三种位置,且路径格式有特殊规定:
view plain
1. /**
2. * Resource path prefix that specifies to load from a classpath location, value is <b>{@code classpath:}</b>
3. */
4. public static final String CLASSPATH_PREFIX = "classpath:";
5. /**
6. * Resource path prefix that specifies to load from a url location, value is <b>{@code url:}</b>
7. */
8. public static final String URL_PREFIX = "url:";
9. /**
10. * Resource path prefix that specifies to load from a file location, value is <b>{@code file:}</b>
11. */
12. public static final String FILE_PREFIX = "file:";
至此,我们知道,其路径需要一个前缀,如果是使用类路径,则在前面加classpath:,比如 classpath:shiro.ini,如果使用文件路径,则在前面加file:,比如 e:\shiro.ini,如果使用网路路径,同样在前面加url:,如url:
那为什么,我们使用文件路径/WEB-INF/shiro.ini又不对呢?
于是,我使用java创建一个文件,代码如下:
view plain
1. private void createFile(String uri){
2. try {
3. File file = new File(uri);
4. if (!file.exists()) {
5. if (!file.createNewFile()) {
6. throw new Exception("文件不存在,创建失败!");
7. }
8. }
9. } catch (Exception e) {
10. System.out.println(e.getMessage());
11. }
12. }
调用createFile("222.ini")时,发现222.ini文件被创建在glassfish的域目录根目录下面,也就是C:\glassfish-3.1.1\glassfish\domains\domain1下。
调用createFile("/222.ini")时,这个文件被创建在c:\根目录下。
终于明白了,原来是netbeans捣的鬼,在调试时,netbeans会将项目文件部署到glassfish的域中去,如果直接在JAVA代码中使用路径,则都是相对域进行的。
其实这也是shiro 1.1的不足之处,shiro在配置路径参数时,没有对该路径进行处理,而是直接将路径传递过去。
后又在http://shiro.apache.org/web.html中发现这样一句话:
view plain
1. ServletContext resource paths - Shiro 1.2+
2. ServletContext resource paths are an upcoming feature in Shiro 1.2. Until 1.2 has been released, all configPath definitions must specify a classpath:, file: or url: prefix.
ServletContext 资源路径是一个即将在1.2中实现的特性,在1.2发布之前,所有configPath参数的定义,必须指定classpath:, file: or url:中的一个前缀。
期待shiro1.2能尽快发布!!!
另外
1、使用classpath:前缀的时候,可将shiro.ini拷贝到C:\glassfish-3.1.1\glassfish\domains\domain1\lib下即可,或者使用包目录,如:classpath:cn/org/lycz/www/mb/shiro.ini。
2、IniShiroFilter还有一个参数config,可以将shiro.ini中的内容直接写在web.xml中,如:
view plain
1. <filter>
2. <filter-name>ShiroFilter</filter-name>
3. <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
4. <init-param>
5. <param-name>config</param-name>
6. <param-value>
7. [users]
8. zwx=zavens
9. </param-value>
10. </init-param>
11. </filter>
12. <filter-mapping>
13. <filter-name>ShiroFilter</filter-name>
14. <url-pattern>/*</url-pattern>
15. </filter-mapping>
在WEB应用中使用mysql部署shiro安全框架
shiro框架提供了验证、授权、加密、会话管理等常用的安全功能,而且使用POJO式的API使得该框架能部署在大多数的环境中,此外还针对不同的情形提供了各种API实现,在数据存储上,其开放式的API使得我们在不同数据环境中进行方便自如的切换,shiro同样支持MYSQL方式,下面是使用MYSQL数据库的SHIRO配置:
view plain
1. [main]
2. ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource
3. ds.serverName = 10.0.31.77
4. ds.user = root
5. ds.password =zavens
6. ds.databaseName = users
7. ds.url = jdbc:mysql://10.0.31.77:3306/zavens
8. jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
9. jdbcRealm.permissionsLookupEnabled = true
10. jdbcRealm.authenticationQuery = SELECT password FROM users WHERE username = ?
11. jdbcRealm.userRolesQuery = SELECT rolename FROM user_roles WHERE username = ?
12. jdbcRealm.permissionsQuery = SELECT permission FROM role_permissions WHERE rolename = ?
13. jdbcRealm.dataSource = $ds
14.
15. authc.loginUrl = /login.xhtml
16. perms.unauthorizedUrl = /login.xhtml
17. roles.unauthorizedUrl = /login.xhtml
18. [urls]
19. /admin/**=authc,perms[jimi]
20. /system/**=authc,perms[juemi]
这里需要说明的是,jdbcRealm.authenticationQuery,jdbcRealm.userRolesQuery,jdbcRealm.permissionsQuery配置行,相对应的时三个表users,user_roles,role_permissions,这三行是告诉SHIRO从何处获取授权的配置,他们是jdbc的预查询语句。authenticationQuery用于从users中查找密码来进行验证,查询后取得第一条记录的第一个字段进行验证。userRolesQuery用于从user_roles查找所属的角色,它可以是多行,但是要保证查询后的角色是第一个字段。permissionsQuery用于从role_permissions中查找权限字符串,同样要求是第一个字段,可以是多条记录。
当告诉SHIRO从哪里获取授权后,还得告诉SHIRO对谁进行授权。[urls]部分就是起这个作用。/admin/**=authc,perms[jimi] 这句,/admin/**是指针对admin目录配置权限,authc,是系统内置的过滤器,告诉shiro,进入此目录,必须是已验证的登录用户。perms[jimi] 是权限限定符,perms同样是内置的过滤器,指org.apache.shiro.web.filter. authz.PermissionsAuthorizationFilter,jimi是通过jdbcRealm.permissionsQuery查询出来的权限字符串,只有用户获得的角色含有该字符串,才能获得访问授权。如果针对角色授权,可以是/admin/**=authc,roles[admin] .
SHIRO内置了很多过滤器,如下:
view plain
1. anon org.apache.shiro.web.filter.authc.AnonymousFilter
2. authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
3. authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
4. logout org.apache.shiro.web.filter.authc.LogoutFilter
5. noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter
6. perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
7. port org.apache.shiro.web.filter.authz.PortFilter
8. rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
9. roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
10. ssl org.apache.shiro.web.filter.authz.SslFilter
11. user org.apache.shiro.web.filter.authc.UserFilter
转自:
展开阅读全文