Shiro 学习笔记(7)—— Shiro 集成 Web

这一节介绍了在 Web 项目中使用 Shiro 的步骤。

Shiro 学习笔记(7)—— Shiro 集成 Web

在 Web 环境下集成 Shiro 其实不难,按照官方文本的说明实现就可以了。更多地,我们会在 Spring 的 Web 环境中使用 Shiro ,这个我们后面再讲。

参考 Shiro 官方文档中集成 Web 的这个章节:http://shiro.apache.org/webapp-tutorial.html

项目源码下载:https://github.com/weimingge14/Shiro-Web

步骤1:在 web.xml 部署描述符中配置 Shiro。

<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>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

步骤2:配置 shiro.ini

默认的情况下,Shiro 使用的核心配置文件就是在 WEB-INF/classes 根路径下的 shiro.ini 。如果你使用的是 Maven 或者 Gradle 构建,可以把 shiro.ini 文件放在 resources 目录下。

下面这个配置文件,我都详细地写了每一项配置的说明。

[main]
# 身份认证不通过的用户,Shiro 会帮助跳转(Get)到一个地址
# 这个地址只能是站内的一个地址
authc.loginUrl=/login
# 在身份认证成功的前提下,用户不具有相应的角色,跳转(Get)到下面这个链接
roles.unauthorizedUrl=/unauthorized-noRole.jsp
# 在身份认证成功的前提下,用户不具有相应的权限,跳转(Get)到下面这个链接
perms.unauthorizedUrl=/unauthorized-noPermission.jsp

[users]
# 用户 liwei 具有角色 admin
liwei=123456,admin
zhouguang=666666,teacher
yuanlian=888888
lirui=999999

[roles]
# admin 角色的定义
admin=user:*
# teacher 角色的定义
teacher=student:*

[urls]
# 访问 /login 不须要身份认证
/login=anon
# 访问 /admin 须要身份认证
/admin=authc
# 访问 /student 不仅须要身份认证,而且还要具有角色 teacher
/student=roles[teacher]
# 访问 /teacher 不仅须要身份认证,而且还要具有权限 "user:create"
/teacher=perms["user:create"]

步骤3:编写登录认证的代码

以前我们写的测试代码中有一句 SecurityUtil.setSecurityManager(securityManager) ,在 Web 集成了 Shiro 以后,我们不用写这一句,就可以完成认证的操作。

以下是示例代码。

@WebServlet(name = "LoginServlet",urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("login post");
        String userName =request.getParameter("userName");
        String password =request.getParameter("password");
        // 因为 SecurityUtil.setSecurityManager(securityManager)
        // 这件事情都交给了 web.xml 配置的监听器来完成了,所以这里不用写了
        Subject currentUser = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(userName,password,"xx");
        try {
            currentUser.login(token);
            // 登录成功以后重定向跳转到 success.jsp
            response.sendRedirect("success.jsp");
        }catch (UnknownAccountException e){
            e.printStackTrace();
            System.out.println("无效的用户名");
            request.setAttribute("errorInfo", "用户名错误");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }catch (IncorrectCredentialsException e){
            System.out.println("错误的密码");
            request.setAttribute("errorInfo", "密码错误");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }catch (AuthenticationException e) {
            e.printStackTrace();
            request.setAttribute("errorInfo", "其它 AuthenticationException ");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
        // 这里不能用 currentUser.logout(); 否则每次进来都要验证
        // currentUser.logout();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("login get");
        request.getRequestDispatcher("login.jsp").forward(request, response);
    }
}

其实这个时候项目的大题框架已经建好了,后面再有就是一些页面的设置,在这里就不多展示代码,占用文章篇幅了,大家可以下载我的代码,在本地跑起来自己测试一下。最最核心的是要理解 shiro.ini 这个核心配置文件每一项的意义,然后进行相应的测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值