源代码:https://gitee.com/jiaodacailei/shiro-springmvc-demo.git
核心概念
Shiro是一个Java权限框架,与之相对的有一个spring的框架:Spring Security
创建Maven-web项目
配置pom.xml
参考:
shiro-webpom.xml
配置web.xml
配置spring/springmvc/shiro,重点:
配置spring
src/main/resources/applicationContext.xml
src/main/resources/spring-shiro-web.xml
配置springmvc
参考:springmvc-servlet.xml
登录页和首页加载
创建main.jsp和login.jsp
MainController映射
认证
shiro的内部认证流程如下,如果看不明白,可以先略过,后面例子完成后再看。
现在,我们要完成登录表单post提交到/login时,让shiro帮我们完成认证。当然,我们仍然需要编写认证的逻辑,在Realm中完成。
在spring的shiro配置中,定义Realm
src/main/resources/spring-shiro-web.xml
需要在securityManager中注入自定义realm,此处为userRealm
创建UserRealm类
继承AuthorizingRealm,并重写获取认证信息的方法即可
处理认证失败,需要在Controller中增加/login的Post映射:
授权
接着,我们要完成授权,实现admin用户登录系统可以看到用户、角色、菜单三个模块;而cai用户登录系统,则只能看到用户模块。
修改UserRealm
修改UserRealm,重写获取授权信息的方法即可
验证权限
需要修改main.jsp,采用shiro标签库验证权限,还没有多种权限认证方式,见后面的权限验证那一小节。
还需要shiro标签库
过滤器
过滤器 | 作用 |
anon | 匿名过滤器:对应的url,无需任何认证即可访问,即,可以匿名访问。 |
authc | 表单认证过滤器:对应的url的get请求,验证用户是否登录,如果没有登录,则跳转登录页面;对应的url的post请求,会获取表单中的用户名和密码,调用用户提供的Realm的doGetAuthenticationInfo(AuthenticationToken token)进行认证,认证通过则返回首页。 |
user | 用户过滤器:对应的url请求,验证用户是否登录,如果没有登录则跳转登录页面,用户输入登录信息,登录成功后,回跳转回初次访问的url。 |
logout | 注销过滤器:将shiro中的用户注销,并返回首页 |
User过滤器测试:
当系统启动时,首先访问url: /2
会跳转登录页,认证成功后,会跳回 /2
获取用户
在我们实际代码中,如何获取用户信息呢?
例如,我们经常会在登录成功后将用户信息放在HttpSession中,在后续的请求中,就获取该用户信息,从而使用它。
在Shiro中,我们可以通过SecurityUtils.getSubject().getPrincipal()获取当前用户信息:
该用户信息是我们在UserRealm中设置的(红框中的内容):
权限验证
下面时shiro权限验证的内部流程,如果看不懂,可以先略过,后面完成例子之后再回过头来看。
权限验证主要是指,当我们已经登录成功后,怎么判断当前用户有哪些权限,是什么角色?
主要包含下面三种验证方式:
Java编码方式验证权限
SecurityUtils.getSubject().hasRole(“admin”)
SecurityUtils.getSubject().isPermitted(“menu:view”)
注解方式验证权限
配置
代码
@RequireRoles
@RequirePermissions
测试
分别使用admin和cai用户登录系统,然后分别访问/msg
admin用户会看到true,cai用户没有权限:
采用shiro的jsp标签库
<shiro:hasPermission/>
<shiro:hasRole/>