Apache Shiro快速入门教程之与Web项目整合(二)
Shiro Web 集成
shiro与web集成,主要是通过配置一个ShiroFilter 拦截所有url,其中ShiroFilter 类似于如 Strut2/SpringMVC 这种 web 框架的前端控制器,是所有请求的入口点,其负责读取配置(如 ini 配置文件) , 判断 URL 是否需要登录 / 权限等工作。
1.添加依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<--shiro对web的支持依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.2</version>
</dependency>
<--shiro核心依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>
2.web.xml配置shiro过滤器
<!--初始化securityManager对象所需的环境配置-->
<context-param>
<param-name>shiroEnvironmentClass</param-name>
<!-- 默认先从/WEB-INF/shiro.ini,如果没有找classpath:shiro.ini -->
<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 然后获取相应的依赖。-->
<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
authc.loginUrl=/login.jsp
#用户无对应角色时跳转的页面
roles.unauthorizedUrl=/noRoles.jsp
#用户无对应权限时跳转的页面
perms.unauthorizedUrl=/noPerms.jsp
#退出后跳转的页面
logout.redirectUrl=/login
[urls]
//配置请求url权限控制,url路径=shiro默认的权限拦截过滤器
#静态资源允许匿名访问
/login=anon
/static/** =anon
#访问用户列表需要身份认证以及拥有角色admin角色
/getAllUserList =authc,roles[admin]
#访问部门列表需要身份认证以及拥有dept_getAllDept权限
/getAllDept =authc,perms[dept_getAllDept]
#当进行退出操作,会被logout捕获并清除session
/loginOut=logout
#所有请求都需要进行身份认证
/** =authc
4.登录测试
@WebServlet(name = "loginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String errorClassName = (String)req.getAttribute("shiroLoginFailure");
if(UnknownAccountException.class.getName().equals(errorClassName)) {
req.setAttribute("error", "用户名/密码错误");
} else if(IncorrectCredentialsException.class.getName().equals(errorClassName)) {
req.setAttribute("error", "用户名/密码错误");
} else if(errorClassName != null) {
req.setAttribute("error", "未知错误:" + errorClassName);
}
//不处理登录成功(认证成功),shiro会自动跳转到上一个请求路径
req.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(req, resp);
}
}
5.authc拦截注意点:
1.登录认证时拦截判断用户是否登录,登录放行,未登录则跳转到authc.loginUrl属性配置的路径,默认是login.jsp
2.执行登录认证时如果请求路径是authc.loginUrl配置路径(未配置则默认是login.jsp),如果没登录,authc会尝试获取请求中的账号密码,然后与ini配置文件或realm中用户列表对比,比对正确直接登录,比对失败,抛出异常,跳转到authc.loginUrl指定路径
3.authc 是 org.apache.shiro.web.filter.authc.FormAuthenticationFilter 类型的实例,其用于实现基于表单的身份验证.请求中账号密码必须是username与password,若需改动,则必须额外指定authc.usernameParam =xxx,authc.passwordParam =xxx
4.当第一次请求时,shiro拦截发现用户未登录自动跳转到authc.loginUrl配置路径,同时保存当前请求路径。当第二次请求时,shiro拦截发现是登录操作,执行登录认证成功后会检查是否有保存url路径,若果有执行跳转之前保存的路径,如果没有默认跳转到/路径
Shiro JSP 标签
1.JSP 标签
Shiro 提供了 JSTL 标签用于在 JSP/GSP 页面进行权限控制,如根据登录用户显示相应的页面按钮。
2.导入标签库
标签库定义在 shiro-web.jar 包下的 META-INF/shiro.tld 中定义。
<%@taglib prefix=“shiro” uri=“http://shiro.apache.org/tags” %>
2.使用标签库
1.guest 标签:用户没有身份验证时显示相应信息,即游客访问信息。
<shiro:guest>欢迎游客访问,<a href="${pageContext.request.contextPath}/login.jsp">登录</a></shiro:guest>
2.user 标签:用户已经身份验证 / 记住我登录后显示相应的信息。
<shiro:authenticated>用户[<shiro:principal/>]已身份验证通过</shiro:authenticated>
3.authenticated 标签:用户已经身份验证通过,即 Subject.login 登录成功,不是记住我登录的。
<shiro:authenticated>用户[<shiro:principal/>]已身份验证通过</shiro:authenticated>
4.notAuthenticated 标签: 用户已经身份验证通过,即没有调用 Subject.login 进行登录,包括记住我自动登录的也属于未进行身份验证。
<shiro:notAuthenticated> 未身份验证(包括记住我)</shiro:notAuthenticated>
5.principal 标签 : 显示用户身份信息,默认调用 Subject.getPrincipal() 获取,即 Primary Principal。
<shiro: principal/>
6.hasRole 标签: 如果当前 Subject 有角色将显示 body 体内容。
<shiro:hasRole name="admin"> 用户[<shiro:principal/>]拥有角色admin<br/> </shiro:hasRole>
7.hasAnyRoles 标签 : 如果当前 Subject 有任意一个角色(或的关系)将显示 body 体内容。
<shiro:hasAnyRoles name="admin,user">
用户[<shiro:principal/>]拥有角色admin或user<br/>
</shiro:hasAnyRoles>
8.lacksRole 标签: 如果当前 Subject 没有角色将显示 body 体内容。
shiro:lacksRole name="abc"> 用户[<shiro:principal/>]没有角色abc<br/> </shiro:lacksRole>
9.hasPermission 标签: 如果当前 Subject 有权限将显示 body 体内容。
<shiro:hasPermission name="user:create">用户[<shiro:principal/>]拥有权限user:create<br/></shiro:hasPermission>
10.lacksPermission 标签:如果当前 Subject 没有权限将显示 body 体内容。
<shiro:lacksPermission name="org:create"> 用户[<shiro:principal/>]没有权限org:create<br/> </shiro:lacksPermission>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137148.html