shiro与web应用的集成

1.添加依赖

  <dependencies>
  	 <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>
        <!-- shiro核心的依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.2.2</version>
        </dependency>
		<!-- shiro对web支持的依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- serlvet-api -->	
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
  </dependencies>
  <build>
  	<plugins>
  		<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>80</port>
					<path>/</path>
				</configuration>
			</plugin>
  	</plugins>
  </build>

2.在web.xml文件中配置shiro拦截请求

	<context-param>  
	   <param-name>shiroEnvironmentClass</param-name>  
	   <param-value>org.apache.shiro.web.env.IniWebEnvironment</param-value>  
	</context-param>  
	<context-param>  
        <param-name>shiroConfigLocations</param-name>  
        <param-value>classpath:shiro.ini</param-value>  
    </context-param>
    <!-- 
    	从Shiro 1.2开始引入了Environment/WebEnvironment的概念,即由它们的实现提供相应的SecurityManager及其相应的依赖。
    	ShiroFilter会自动找到Environment然后获取相应的依赖。
    	底层:返回反射创建shiroEnvironmentClass对象,调用其init方法.
    		shiroEnvironmentClass中的init方法创建SecurityManager实例并绑定到当前运行环境
     -->
	<listener>  
	   <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>  
	</listener>
	<!-- 拦截所有的请求 -->  
	<filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

3.添加Shiro.ini配置文件

[main]  
#默认是/login.jsp  
authc.loginUrl=/login
#用户无需要的角色时跳转的页面
roles.unauthorizedUrl=/nopermission.jsp 
#用户无需要的权限时跳转的页面
perms.unauthorizedUrl=/nopermission.jsp
#登出之后重定向的页面
logout.redirectUrl=/main
[users]  
zhangsan=666,admin  
lisi=888,deptMgr
[roles]  
admin=employee:*,department:*
deptMgr=department:view
[urls]  
#静态资源可以匿名访问
/static/**=anon
#访问员工列表需要身份认证及需要拥有admin角色
/employee=authc,roles[admin]
#访问部门列表需要身份认证及需要拥有department:view的权限
/department=authc,perms["department:view"]
#当请求loginOut,会被logout捕获并清除session
/loginOut=logout
#所有的请求都需要身份认证
/** = authc

3.1shiro默认的拦截器
过滤器简称 对应的java类
anon org.apache.shiro.web.filter.authc.AnonymousFilter
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
user org.apache.shiro.web.filter.authc.UserFilter
logout org.apache.shiro.web.filter.authc.LogoutFilter
port org.apache.shiro.web.filter.authz.PortFilter
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
ssl org.apache.shiro.web.filter.authz.SslFilter

anon:匿名拦截器,即不需要登录即可访问;一般用于静态资源过滤;示例“/static/=anon”
authc:表示需要认证(登录)才能使用;示例“/
=authc”
主要属性:usernameParam:表单提交的用户名参数名( username); passwordParam:表单提交的密码参数名(password); rememberMeParam:表单提交的密码参数名(rememberMe); loginUrl:登录页面地
址(/login.jsp);successUrl:登录成功后的默认重定向地址; failureKeyAttribute:登录失败后错误信息存储key(shiroLoginFailure);
authcBasic:Basic HTTP身份验证拦截器,主要属性: applicationName:弹出登录框显示的信息(application);
roles:角色授权拦截器,验证用户是否拥有资源角色;示例“/admin/**=roles[admin]”
perms:权限授权拦截器,验证用户是否拥有资源权限;示例“/user/create=perms[“user:create”]”
user:用户拦截器,用户已经身份验证/记住我登录的都可;示例“/index=user”
logout:退出拦截器,主要属性:redirectUrl:退出成功后重定向的地址(/);示例“/logout=logout”
port:端口拦截器,主要属性:port(80):可以通过的端口;示例“/test= port[80]”,如果用户访问该页面是非80,将自动将请求端口改为80并重定向到该80端口,其他路径/参数等都一样
rest:rest风格拦截器,自动根据请求方法构建权限字符串(GET=read, POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create)构建权限字符串;
示例“/users=rest[user]”,会自动拼出“user:read,user:create,user:update,user:delete”权限字符串进行权限匹配(所有都得匹配,isPermittedAll);
ssl:SSL拦截器,只有请求协议是https才能通过;否则自动跳转会https端口(443);其他和port拦截器一样;
注:
anon,authcBasic,auchc,user是认证过滤器,
perms,roles,ssl,rest,port是授权过滤器

3.2过滤器设置属性
这些默认的拦截器会自动注册,可以直接在ini配置文件中通过“拦截器名.属性”设置其属性:

#如果身份验证没有通过,就跳转到loginUrl指定的页面
authc.loginUrl=/login
#如果用户没有角色,就跳转到unauthorizedUrl指定的页面
roles.unauthorizedUrl=/nopermission.jsp
#如果用户没有权限,就跳转到unauthorizedUrl指定的页面
perms.unauthorizedUrl=/nopermission.jsp

另外如果某个拦截器不想使用了可以直接通过如下配置直接禁用:
perms.enabled=false

4.登录的方法如下:

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//如果登陆失败从request中获取认证异常信息,shiroLoginFailure就是shiro异常类的全限定名
		String exceptionClassName = (String) req.getAttribute("shiroLoginFailure");
		//根据shiro返回的异常类路径判断,抛出指定异常信息
		if(exceptionClassName!=null){
			if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
				//最终会抛给异常处理器
				req.setAttribute("errorMsg","账号不存在");
			} else if (IncorrectCredentialsException.class.getName().equals(
					exceptionClassName)) {
				req.setAttribute("errorMsg","用户名/密码错误");
			} else {
				req.setAttribute("errorMsg","其他异常信息");//最终在异常处理器生成未知错误
			}
		}
		//此方法不处理登陆成功(认证成功),shiro认证成功会自动跳转到上一个请求路径
		//登陆失败还到login页面
		req.getRequestDispatcher("/login.jsp").forward(req, resp);
	}

5.shiro的jsp标签库
Jsp页面添加:
<%@ tagliburi=“http://shiro.apache.org/tags” prefix=“shiro” %>

标签名称 标签条件(均是显示标签内容)
shiro:authenticated 登录之后
shiro:notAuthenticated 不在登录状态时
shiro:guest 用户在没有RememberMe时
shiro:user 用户在RememberMe时
<shiro:hasAnyRoles name=“abc,123” > 在有abc或者123角色时
<shiro:hasRole name=“abc”> 拥有角色abc
<shiro:lacksRole name=“abc”> 没有角色abc
<shiro:hasPermission name=“abc”> 拥有权限资源abc
<shiro:lacksPermission name=“abc”> 没有abc权限资源
shiro:principal 显示用户身份名称
<shiro:principal property=“username”/> 显示用户身份中的属性值

6.使用logout过滤器实现用户登出
/loginOut=logout

发布了52 篇原创文章 · 获赞 2 · 访问量 212

猜你喜欢

转载自blog.csdn.net/weixin_41588751/article/details/103978958
今日推荐