源代码:https://gitee.com/jiaodacailei/shiro-springmvc-demo.git

核心概念

Shiro是一个Java权限框架,与之相对的有一个spring的框架:Spring Security

 

 

创建Maven-web项目

配置pom.xml

参考:

\shiro-web\pom.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/>