简介:
Shiro 提供了与 Web 集成的支持,其通过一个 ShiroFilter入口来拦截需要安全控制的 URL,然后进行相应的控制,ShiroFilter 类似于如 Strut2/SpringMVC 这种 web 框架的前端控制器,其是安全控制的入口点,其负责读取配置(如 ini 配置文件),然后判断 URL 是否需要登录 / 权限等工作。
Url 匹配方式
? 匹配一个字符 /admin? 可以匹配/admin1 或者/admin2 但是不能匹配/admin12 或者/admin
* 匹配零个或者一个或者多个字符 /admin* 可以匹配 /admin 或者/admin1 或者 /admin12 但是不能匹配/admin/abc
** 匹配零个或者多个路径 /admin/** 可以匹配/admin /admin/a 或者/admin/a/b
pom.xml
javax.servlet
javax.servlet-api
3.0.1
provided
junit
junit
4.9
commons-logging
commons-logging
1.1.3
org.apache.shiro
shiro-web
1.2.2
org.apache.shiro
shiro-core
1.2.2
org.springframework.boot
spring-boot-starter-web
web.xml
t
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
org.apache.shiro.web.env.EnvironmentLoaderListener
shiroConfigLocations
classpath:shiro-web.ini
ShiroFilter
org.apache.shiro.web.servlet.ShiroFilter
ShiroFilter
/*
REQUEST
FORWARD
INCLUDE
ERROR
loginServlet
com.lc.LoginServlet
loginServlet
/login
shiro-web.ini
[main]
authc.loginUrl= /login
roles.unauthorizedUrl= /unauthorized.jsp
perms.unauthorizedUrl= /unauthorized.jsp
[users]
admin=123,role1
user1=456
[roles]
role1=admin:*
#如果加入了shiro-web支持,则需要配置urls,否则报错:Caused by: org.apache.shiro.env.RequiredTypeException:
#Object named 'filterChainResolver' is not of required type [org.apache.shiro.web.filter.mgt.FilterChainResolver].
[urls]
/index.jsp = authc
/ = authc
/admin.jsp = authc,roles[role1]
/login = anon
/logout = logout
anon: 无需认证即可访问
authc: 需要认证才可访问
user: 点击“记住我”功能可访问
perms: 拥有权限才可以访问
role: 拥有某个角色权限才能访问
上面的配置文件说明:index,jsp要认证,admin.jsp不仅仅要认证还得有admin角色,/login无需认证谁都能看到
servlet
@WebServlet(name = "loginServlet", urlPatterns = "/login")public class LoginServlet extendsHttpServlet {private static final long serialVersionUID = 1L;
@Overrideprotected voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {/*** 如果用户没有登录就即没有在index.jsp页面登录就会跳转到这个方法*/request.getRequestDispatcher("/login.jsp").forward(request, response);
}
@Overrideprotected voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
request.setCharacterEncoding("UTF-8");
String userName= request.getParameter("username");
String passWord= request.getParameter("password");
Subject subject=SecurityUtils.getSubject();
UsernamePasswordToken token= newUsernamePasswordToken(userName, passWord);try{
subject.login(token);
System.out.println("登录成功");
request.getRequestDispatcher("/index.jsp").forward(request, response);
}catch(UnknownAccountException e) {
System.out.println("用户名错误");
response.sendRedirect("/login.jsp");
}catch(IncorrectCredentialsException e) {
System.out.println("密码错误");
response.sendRedirect("/login.jsp");
}
}
}
index.jsp
欢迎登陆
admin.jsp
admin.jsp
unauthorized.jsp
该用户没有权限访问