shiro笔记

shiro

一、环境搭建

1、创建一个普通的maven项目,引入shiro的pom依赖

<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-core</artifactId>
  <version>1.5.3</version>
</dependency>

2、引入shiro配置文件shiro.ini,并加入以下配置

# 约定写法
[users]
# 用户名=密码
christy=123456
tide=654321

shiro的配置文件是一个.ini文件,类似于.txt文件
.ini文件经常用作某些软件的特定的配置文件,可以支持一些复杂的数据格式,shiro可以按照内部约定的某种格式读取配置文件中的数据
之所以提供这个配置文件是用来学习shiro时书写我们系统中相关的权限数据,从而减轻配置数据库并从数据库读取数据的压力,降低学习成本,提高学习效率
二、测试实例

1、初始化获取securityManager

//IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro.ini");
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager=factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);

2、获取当前用户的subject对象

Subject currentUser=SecurityUtils.getSubject();

3、通过当前用户拿到session

Session session=currentUser.getSession();

4、判断当前用户是否被认证

1f(! currentuser . 1SAuthenticated() ) {
//Token : 令牌
UsernamePasswordToken token = new UsernamePasswordToken( username:"lonestanr" ,password: "vespa" );
token.setRememberMe(true); /设置记住我
}

5、核心方法

currentUser.getPrincipal();
currentUser.hasRole("schwartz")
currentUser.isPeritted("lightsaber:wield")
currentUser.logout();
三、集成springboot项目整合shiro

subject 用户

Securitymanager 管理所有用户

realm 连接数据

shiro常见过滤器
配置缩写对应过滤器功能
annoAnonymousFilter无需认证就可以访问
authcFormAuthenticationFilter必须认证了才能访问
roleRolesAuthorizationFilter拥有某个角色权限才能访问
userUserFilter必须拥有记住我功能才能访问
permsPermissionsAuthorizationFilter拥有对某个资源的权限才能访问
(1)编写配置类ShiroConfig
 @Configuration
 public class  ShiroConfig{
 
 //3、 ShiroFilterFactoryBean
public ShiroFilterFactoryBean getShinroFilterFactoryBean(@Qqualifier("securityNanager")DefaultwebSecuritylanager defaultwebSecuritylanager)){
ShiroFilterFactoryBean bshiroFilterFactoryBeanean = new ShiroFilterFactoryBean();
//设置安全管理器
bean. setSecurityManager(defaultwebSecurityManager);
        //添加shiro的内置过滤器
        //配置系统受限资源
        //配置系统公共资源
        Map<String,String> map = new HashMap<String,String>();
        map.put("/index.jsp","authc");//authc 请求这个资源需要认证和授权

        //默认认证界面路径(shiro没有默认登录页面,需要自己写)
        shiroFilterFactoryBean.setLoginUrl("/login.jsp");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);

return shiroFilterFactoryBean;
}

//2、DafaultwebSecurityManager
@Bean( name="securityManager")
public DefaultwebSecuritylanager getDefaultNebSecuritywanager(@Qualifier("userRealm")UserRealm userRealm){
DefaultwebSecurityManager securityManager = new DefaultwebSecurityManager();
/关联userReaLm
securityManager.setRealm(userRealm);
return securityManager;
}

//1、创建realm 对象,需要自定义类
@Bean
public UserRealm userRealm(){
return new UserRealm( );
}
}
(2)自定义userRealm
//自定义的UserReaLm extends AuthorizingReaLm
public class UserRealm extends AuthorizingRealm {
/授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println("执行了=>授权doGetAuthorizationInfo" );
return null;
}
I
//认证
Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationExceptiopn{
System.out.println("执行了=>认证doGetAuthorizationInfo");
return nu11;
}

(3)controller层
 @RequestMapping("login")
    public String login(String username,String password){
        // 获取当前登录用户
        Subject subject = SecurityUtils.getSubject();
        //封装用户的登录数据
        UsernamePasswordToken token=new UsernamePasswordToken(username,password);
        try {
            // 执行登录操作
            subject.login(new UsernamePasswordToken(username,password));
            // 认证通过后直接跳转到index.jsp
            return "redirect:/index.jsp";
        } catch (UnknownAccountException e) {//用户名不存在
            e.printStackTrace();
            System.out.println("用户名错误~");
        } catch (IncorrectCredentialsException e) {//密码不存在
            e.printStackTrace();
            System.out.println("密码错误~");
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 如果认证失败仍然回到登录页面
        return "redirect:/login.jsp";
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值