shiro笔记

shiro

一、环境搭建

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


  org.apache.shiro
  shiro-core
  1.5.3


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 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常见过滤器
配置缩写 对应过滤器 功能
anno AnonymousFilter 无需认证就可以访问
authc FormAuthenticationFilter 必须认证了才能访问
role RolesAuthorizationFilter 拥有某个角色权限才能访问
user UserFilter 必须拥有记住我功能才能访问
perms PermissionsAuthorizationFilter 拥有对某个资源的权限才能访问

(1)编写配置类ShiroConfig

 @Configuration
 public class  ShiroConfig{
 
 //3、 ShiroFilterFactoryBean
public ShiroFilterFactoryBean getShinroFilterFactoryBean(@Qqualifier("securityNanager")DefaultwebSecuritylanager defaultwebSecuritylanager)){
ShiroFilterFactoryBean bshiroFilterFactoryBeanean = new ShiroFilterFactoryBean();
//设置安全管理器
bean. setSecurityManager(defaultwebSecurityManager);
        //添加shiro的内置过滤器
        //配置系统受限资源
        //配置系统公共资源
        Map map = new HashMap();
        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";
    }

你可能感兴趣的:(spring,maven,java,spring,boot,开发语言)