Shiro中的集成Spring框架与Spring Boot应用

编程狂想曲 2019-05-13 ⋅ 36 阅读

Shiro是一个强大且灵活的Java安全框架,可以轻松地实现身份验证、授权、会话管理和加密等安全功能。在开发Web应用时,集成Shiro与Spring框架和Spring Boot应用可以提供更全面的安全性和更容易的配置管理。

本文将介绍如何在Spring框架和Spring Boot应用中集成Shiro,并提供一些常见的配置示例和最佳实践。

1. 引入依赖

首先,我们需要在项目的pom.xml文件中引入相应的依赖。

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.7.1</version>
</dependency>

2. 创建Shiro配置文件

在Spring应用中,我们可以使用ShiroFilterFactoryBeanDefaultWebSecurityManager两个核心组件来配置Shiro。

首先,我们创建一个ShiroConfig类,并使用@Configuration注解将其声明为一个配置类。然后,我们可以定义ShiroFilterFactoryBeanDefaultWebSecurityManager的Bean。ShiroFilterFactoryBean用于创建一个DelegatingFilterProxy,该代理将Shiro的所有请求和处理委托给配置的Filter。DefaultWebSecurityManager则是Shiro的核心安全管理器,负责所有的身份验证和授权操作。

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 设置登录页面
        shiroFilterFactoryBean.setLoginUrl("/login");
        // 设置未授权页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
        // 设置过滤器链规则
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/admin/**", "roles[admin]");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager(UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 设置Realm
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }
}

3. 创建Shiro Realm

Shiro使用Realm来验证用户的身份和授权访问资源。我们需要创建一个UserRealm类,并继承AuthorizingRealm抽象类。在UserRealm中,我们可以实现doGetAuthorizationInfo()方法来处理角色和权限的授权逻辑,以及doGetAuthenticationInfo()方法来处理用户身份验证逻辑。

public class UserRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        // 根据用户名查询用户角色和权限
        Set<String> roles = userService.getRolesByUsername(username);
        Set<String> permissions = userService.getPermissionsByUsername(username);
        authorizationInfo.setRoles(roles);
        authorizationInfo.setStringPermissions(permissions);
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        User user = userService.getUserByUsername(username);
        if (user == null) {
            throw new UnknownAccountException();
        }
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
        return authenticationInfo;
    }
}

4. 安全注解和配置

在Spring框架和Spring Boot应用中,我们可以使用@RequiresRoles@RequiresPermissions注解来标记相应的Controller方法或者类,并实现访问控制的功能。要启用安全注解,我们需要在Spring配置类中添加@EnableAspectJAutoProxy(proxyTargetClass = true)注解。

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class ShiroConfig {
   //...
}

在需要进行访问控制的Controller方法或者类上添加@RequiresRoles@RequiresPermissions注解。

@Controller
@RequestMapping("/admin")
public class AdminController {
    
    @RequiresRoles("admin")
    @RequestMapping("/deleteUser")
    public String deleteUser() {
        // ...
    }
}

5. 集成Spring Boot应用

在Spring Boot应用中,可以进一步简化Shiro的配置。首先,我们可以将ShiroConfig类修改为一个配置类。

@Configuration
public class ShiroConfig {

    // ...
}

然后,在项目的application.propertiesapplication.yml文件中添加相关的配置。

# Shiro配置
shiro:
  loginUrl: /login
  unauthorizedUrl: /unauthorized

最后,我们需要将Shiro的配置类交给Spring Boot容器管理,使用@Import注解将ShiroConfig类导入。

@SpringBootApplication
@Import(ShiroConfig.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

以上就是在Spring框架和Spring Boot应用中集成Shiro的基本步骤和配置示例。通过集成Shiro,我们可以轻松地实现强大的安全功能,并提供更好的用户体验和控制权限。

希望这篇博客能够帮助你理解如何在Shiro中集成Spring框架和Spring Boot应用,并且能够提供实际开发中的参考和指导。如有任何疑问或建议,欢迎留言交流!


全部评论: 0

    我有话说: