1、使用shiro内置过滤器拦截资源
(1)在ShiroConfig
中加入必须得到资源权限才可以访问的页面
/*必须得到资源权限才可以访问*/
/*必须得到资源权限才可以访问*/
filterMap.put( "/gowrite","perms[admin:add]" );
(2)当前授权拦截后,shiro会自动跳转到未授权页面(报401错误)
需要我们设置一个带有未授权提示的页面。setUnauthorizedUrl()
/授权被拦截后跳转到-未授权页面/
shiroFilterFactoryBean.setUnauthorizedUrl( "/noauth" );
2、编写shiro资源授权逻辑
在UserRealm
资源授权方法中 doGetAuthenticationInfo
进行资源授权
1、创建授权对象
2、授权在ShiroConfig
中添加的授权字符串(授权字符串双方需保持一致)
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
/*进行资源授权*/
/*1、创建授权对象*/
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo( );
/*2、添加资源授权字符串,注意:授权字符串需要与UserRealm里的保持一致*/
info.addStringPermission( "admin:add" );
return info;
}
解决的需求是:当用户未登录时,无法访问该功能,登录后即可访问;
3、连接数据库实现授权
(1)数据库中添加一个perms
的权限字段
(2)编写model .xml dao service service impl
model
package com.bookkeeping.cj.model;
public class Admin {
private Long id;
private String uname;
private String pword;
private String perms;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPword() {
return pword;
}
public void setPword(String pword) {
this.pword = pword;
}
public String getPerms() {
return perms;
}
public void setPerms(String perms) {
this.perms = perms;
}
}
xml
<!--通过id查询用户-->
<select id="selectAdminById" parameterType="java.lang.Integer" resultType="com.bookkeeping.cj.model.Admin" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from
admin
where id = #{id,jdbcType=DECIMAL}
</select>
dao
/*通过id查询用户*/
Admin selectAdminById(@Param( "id" ) Integer id);
service
/*通过id查询用户*/
Admin getAdminById(Integer id);
serviceimpl
/*通过id查询用户*/
@Override
public Admin getAdminById(Integer id) {
return adminMapper.selectAdminById( id );
}
UserRealm
token.getUsername():获取前端输入的用户名
user.getPword():获取数据库中的密码
admin.getId():当前登录人的id
返回null时shiro底层会抛出-UnknownAccountException:用户名不存在
返回SimpleAuthenticationInfo时,该类是AuthorizationInfo的一个子类,要接收三个参数
参数1:返回login方法的一些数据(可为空)
参数2:数据库的密码
参数3:shiro的名字(可为空)
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
/*进行资源授权*/
/*1、创建授权对象*/
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo( );
/*2、添加资源授权字符串,注意:授权字符串需要与UserRealm里的保持一致*/
/* info.addStringPermission( "admin:add" );*/
/*2.1、到数据库中当前登录用户的授权字符串*/
/*2.1.1、获取当前登录用户*/
Subject subject= SecurityUtils.getSubject();
/*user是SimpleAuthenticationInfo传过来的*/
Admin admin=(Admin) subject.getPrincipal();
Admin user=adminService.getAdminById( admin.getId() );
/*获取数据库中的授权字符串*/
info.addStringPermission( user.getPerms() );
return info;
}
需求:根据不同用户的perms权限来判断是否可访问某些页面
二、整合thymleaf+shiro
1、导入依赖
<!--thymeleaf对shiro的扩展坐标-->
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>2.0.0</version>
</dependency>
2、在ShiroConfig
配置ShiroDialect
的,用于thymeleaf和shiro标签配合使用
/*
* 配置`ShiroDialect`的,用于thymeleaf和shiro标签配合使用
*
* */
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}