资讯专栏INFORMATION COLUMN

spring-shiro 基本使用

klinson / 1326人阅读

摘要:配置配置核心控制器过滤器配置同时在中配置匿名的不需要权限需要认证通过即登录成功需要名称为的权限需要名称为的角色说明匹配的的是匹配的是多个比如

maven配置
      
      
        org.apache.shiro  
        shiro-web  
        ${shiro-version}  
      
      
      
        org.apache.shiro  
        shiro-spring  
        ${shiro-version}  
      
      
      
        org.apache.shiro  
        shiro-ehcache  
        ${shiro-version}  
      
    ...
    
        1.2.4
    
spring配置
    
 
  

  

      
  

  
  
      
      
    
    
    
        
            
                
            
        
      
      
          
            /logout.do        = anon    
            /image/*.do        = authc    
            /blog/**.do        = authc,perms[blog] 
            /admin/*.do        = authc,roles[admin] 
            
          
      
  
web.xml
  
    shiroFilter  
    org.springframework.web.filter.DelegatingFilterProxy  
      
        targetFilterLifecycle  
        true  
      
  
  
    shiroFilter  
    *.do  
    



    sitemesh
    org.sitemesh.config.ConfigurableSiteMeshFilter


    sitemesh
    *.do



    springmvc
    org.springframework.web.servlet.DispatcherServlet
    
        contextConfigLocation
        classpath:app-servlet.xml
        
    
    1



    springmvc
    *.do

PS : shiro filter,放在mvc的filter/servlet前面,如果有sitemesh,放在sitemesh前面

Realm类
/**
 * 登录和检查授权的时候调用当前类
 */
@Component("DefaultRealm")
public class DefaultRealm extends AuthorizingRealm {

  @Resource
  private AdminDao adminDao;

  public DefaultRealm() {
    setName("DefaultRealm");// This name must match the name in the User  
  }

  //获取授权信息, 用于验证权限
  @Override
  protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    String username = (String) principalCollection.getPrimaryPrincipal();
    AdminUser admin = adminDao.getUniqueByProperty("username", username);
    Set roleSet = admin.getRoles();
    if (roleSet != null) {
      //获取角色权限
      Set roles = new HashSet<>();
      Set stringPermissions = new HashSet<>();
      for (Role role : roleSet) {
        roles.add(role.getRoleName());

        //封装到验证信息
        Set permissions = role.getPermissions();
        for (Permission permission : permissions) {
          stringPermissions.add(permission.getPermissionName());
        }
      }
      
      SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();  
      authorizationInfo.setRoles(roles);  
      authorizationInfo.setStringPermissions(stringPermissions);  
      return authorizationInfo;
    }
    return null;
  }

  //获取验证信息,用于登录验证用户名密码
  @Override
  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken principals)
      throws AuthenticationException {
    String username = (String) principals.getPrincipal();
    if (StringUtils.isNotEmpty(username)) {
      AdminUser admin = adminDao.getUniqueByProperty("username", username);
      SimpleAccount account = new SimpleAccount(username, admin.getPassword(), getName());
      return account;
    }
    return null;
  }

}
MVC登录验证
//在MVC的Controller中, 接收参数username和password, 装配成UsernamePasswordToken对象,
//然后用subject对象login方法进行登录.
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
Subject subject = SecurityUtils.getSubject();
subject.login(token);
User-Role-Permission实体类
@Entity
public class User {
    private String username; 
    private String password="";
    //省略getter setter
    
    private Set roles;
    
    @ManyToMany(targetEntity=Role.class)
    public Set getRoles() {
      return roles;
    }

    public void setRoles(Set roles) {
      this.roles = roles;
    }
}

@Entity
public class Role{
  private String roleName;    //省略getter setter
  private Set permissions = new HashSet<>();
  
  @ManyToMany
  public Set getPermissions() {
    return permissions;
  }

  public void setPermissions(Set permissions) {
    this.permissions = permissions;
  }
}  

@Entity
public class Permission {
    private String permissionName;//省略getter setter
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65348.html

相关文章

  • shiro项目介绍

    摘要:项目介绍在之前的整合项目之后,更加完善功能,之前的代码不予展示与介绍,想了解的请参考整合项目项目代码获取功能新增用户注册登录错误次数限制使用作缓存注解配置引入数据校验使用统一异常处理配置项目结构代码控制层,以下展示注册和登录功能会跳到我们自 shiro项目介绍 在之前的shiro整合项目之后,更加完善shiro功能,之前的代码不予展示与介绍,想了解的请参考shiro整合项目项目代码获取...

    ruicbAndroid 评论0 收藏0
  • spring-springmvc-mybatis-shiro项目介绍

    摘要:项目介绍在之前的整合项目之后,新增日志简单集成,之前的代码不予展示与介绍,想了解的请参考整合项目项目代码获取项目结构代码控制层,,主要包含登录及几个页面跳转会跳到我们自定义的中登录用户名或密码错误业务处理层,包含一个包,以接口类型存在 spring-springmvc-mybatis-shiro项目介绍 在之前的mybatis整合项目之后,新增日志、简单集成shiro,之前的代码不予展...

    fanux 评论0 收藏0
  • PHP程序员学习路线

    摘要:第一阶段基础阶段基础程序员重点把搞熟练核心是安装配置基本操作目标能够完成基本的系统安装,简单配置维护能够做基本的简单系统的开发能够在中型系统中支持某个功能模块的开发。本项不做重点学习,除非对前端有兴趣。 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护;能够做基本的简单系统的PHP开发;能够在P...

    genedna 评论0 收藏0
  • 14.java 基本数据类型的包装类

    摘要:但是基本数据类型不是对象,不具备对象的特性不携带属性没有方法可调用。自动装箱即直接赋值将会比使用构造方法的方式节省一块堆内存空间,并自动入对象池。而手动装箱使用构造方法会产生两块堆内存,而且不会保存在对象池中。 概念 java在设计之初,有一个基本原则:一切皆对象。但是基本数据类型不是对象,不具备对象的特性——不携带属性、没有方法可调用。为了解决此类问题,Java为每种基本数据类型分别...

    yanbingyun1990 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<