Shiro学习笔记四(Shiro集成WEB)
这两天由于家里出了点事情,没有准时的进行学习。今天补上之前的笔记
-----没有学不会的技术,只有不停找借口的人
学习到的知识点:
1.Shiro 集成WEB
2.基于角色的权限控制
3.基于权限的控制
工程目录结构
下面先是两个Servlet的内容
1.AdminServlet的内容
package com.zuoyan.shiro.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AdminServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("amdin doGet"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("admin doPost"); } }
2.LoginServlet中的内容
package com.zuoyan.shiro.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("login Request get!"); request.getRequestDispatcher("login.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("login dopost"); String userName=request.getParameter("userName"); String password=request.getParameter("password"); Subject subject=SecurityUtils.getSubject(); UsernamePasswordToken token=new UsernamePasswordToken(userName, password); try{ subject.login(token); response.sendRedirect("success.jsp"); }catch(Exception e){ e.printStackTrace(); request.setAttribute("errorInfo", "用户名或者密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); } } }
解释说明一下,这个就是登录的请求,如果登录成功就跳转到success.jsp页面上,如果登录不成功的话,转发的登录界面上 其中使用了Shrio的身份认证!
login.jsp 中的内容就是一个简单的表单提交 提交的地址是login 这个就LoginServlet在这里处理登录请求
3.下面是Shiro.ini 中的内容
[main] authc.loginUrl=/login roles.unauthorizedUrl=/unauthorized.jsp perms.unauthorizedUrl=/unauthorized.jsp [users] java1234=123456,admin jack=123,teacher zuoyan=zuoyan123 [roles] admin=user:* teacher=student:* [urls] /login=anon /admin=authc /student=roles[teacher] /teacher=perms["user:create"]
3.1: authc.loginUrl=/login 进行认证的地址,跳转到LoginServlet处理,然后username和password都为空,认证不通过,就跳转到登录界面
roles.unauthorizedUrl=/unauthorized.jsp 这个是角色权限认证没通过跳转的地址
perms.unauthorizedUrl=unauthorized.jsp 这个是权限认证没有通过 而跳转的界面
[users] :这个是用户的的说明
java1234=123456,admin 这个是设置了账号,还设置了用户的角色
[roles]
admin=user:*
teacher=student:*
[urls]
/login=anon 这个就是匿名也可以访问
/admin=authc 这个是需要认证身份的
/student=roles[teacher] 这个是需要老师身份的才能访问
teacher=perms["user:create"] 这个是需要拥有user:create 的权限,才可以操作
web.xml文件的配置 监听shiro 和配置shiro的支持, 还有配置两个Servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>ShrioWeb</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <!-- 添加shiro支持 --> <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> <servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>com.java1234.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <servlet> <servlet-name>adminServlet</servlet-name> <servlet-class>com.java1234.servlet.AdminServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>adminServlet</servlet-name> <url-pattern>/admin</url-pattern> </servlet-mapping> </web-app>
测试效果,简单说明,如果用户没有登录 运行项目
项目正常的跑起来了
然后访问 http://localhost:8080/ShiroWeb/admin
就会跳转到登录的界面
使用这个账号进行登录
这个是成功登录的效果
然后进行角色测试 访问http://localhost:8080/ShiroWeb/student 我使用的zuoyan这个账号仅仅拥有 admin的角色 而访问student这个需要的是teacher的角色
这个是出现的效果,如果给zuoyan加上teacher的这个角色那么认证就会通过
如果访问
如果访问这个,zuoyan就会认证通过的 因为他是admin角色,而admin的角色拥有对user的一切权限
这个样就是基于角色和权限的控制!