Apache Shiro快速入门教程之与Web项目整合(二)

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Apache Shiro快速入门教程之与Web项目整合(二),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!