一些基本概念
身份验证,即在应用中谁能证明他就是他本人。一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明。
在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份:
principals:身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号。
credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。
最常见的principals和credentials组合就是用户名/密码了。
另外两个相关的概念是之前提到的Subject及Realm,分别是主体及验证主体的数据源。
编写Shiro.ini文件
首先要有一个Shiro.ini的文件如下:
[main]
authc.loginUrl=/login
[users]
kh=123
zs=111
ls=111
[urls]
/admin/**=authc
/login=anon
[urls]下面符合通配符/admin/**的都需要进行权限认证。
符合正则表达式/login的不需要进行权限认证。
[users]下面的是用户名和密码。用户名在前,密码在后。
[main]下面authc.loginUrl是登录连接。
除此之外,Shiro还支持角色管理。
后台处理代码
主要的后台代码如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
//在Shiro中,所有的代码基本上都要经过subject这一层。
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
String emsg = null;
try {
//登录,即身份验证
subject.login(token);
} catch (UnknownAccountException e) {
//身份验证失败
emsg = "用户名出错!";
} catch (IncorrectCredentialsException e) {
emsg = "用户密码出错!";
} catch (AuthenticationException e) {
emsg = "其他异常:"+e.getMessage();
}
if(emsg!=null) {
request.setAttribute("emsg", emsg);
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
} else {
response.sendRedirect(request.getContextPath()+"/");
}
}
角色管理
现在shiro.ini文件更改为如下:
[main]
authc.loginUrl=/login
roles.unauthorizedUrl=/unauth.jsp
perms.unauthorizedUrl=/unauth.jsp
[users]
kh=123,admin
zs=111,user
ls=111
[roles]
admin=admin:*,user:*
user=user:*
[urls]
/admin/**=authc,roles[admin]
/user/add.jsp=authc,perms[user:add]
/user/**=authc
/login=anon
/logout = logout
[roles]下面user只拥有user的权限,而admin拥有admin和user权限
[urls]下
符合通配符/admin/**的链接需要拥有admin角色的用户能访问
/user/add.jsp页面需要拥有增加用户的权限才能访问
/logout = logout表示当我们访问/logout连接的时候直接调用logout过滤器帮我们完成登出。
[users]下
kh是admin角色,zs是user角色,ls没有角色
[main]下的这个两个配置表示当没有权限或者不是该角色就让他跳转到某个页面。
roles.unauthorizedUrl=/unauth.jsp
perms.unauthorizedUrl=/unauth.jsp
如果我们的项目是一个小网站,有很简单的角色,不需要做用户管理,就可以用如上的配置。
但是一般的项目都是通过数据库来配置这些角色的。
Shiro的界面标签
请参考如下代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 要使用Shiro,首先要引入标签库 -->
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>hello <shiro:principal></shiro:principal></h1>
<!-- 如果用户还没有登录就使用shiro:guest标签 -->
<shiro:guest>
<a href="/shiro/login">用户登录</a>
</shiro:guest>
<!-- 如果用户已经登录了,就是用shiro:user标签 -->
<shiro:user>
<a href="/shiro/user/list.jsp">用户列表</a>
<!-- 如下标签标示只有user.add权限才能访问 -->
<shiro:hasPermission name="user:add">
<a href="/shiro/user/add.jsp">用户添加</a>
</shiro:hasPermission>
<!-- 如下标签标示只有admin角色才能看到 -->
<shiro:hasRole name="admin">
<a href="/shiro/admin">管理界面</a>
</shiro:hasRole>
<a href="/shiro/logout">退出系统</a>
</shiro:user>
</body>
</html>