Spring 集成Shiro(注解方式)--官网

Spring集成Shiro(注解方式)

非Web应用

首先往应用程序类路径中添加Shiro-Spring的依赖,推荐使用Maven或者Gradle

maven

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifictId>shiro-spring</artifictId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

gradle

compile 'org.apache.shior:shiro-spring:1.7.1'
compile 'org.springframework:spring-context:${spring.version}'

导入以下Shiro-Spring配置

@Configuration
@Import({
    ShiroBeanConfiguration.class,
    ShiroConfiguration.class,
    ShiroAnnotationProcessorConfiguration.class
})
public class CliAppConfig{
    ...
}

说明如下

配置类 描述
org.apache.shiro.spring.config.ShiroBeanConfiguration 配置Shiro的生命周期和事件
org.apache.shiro.spring.config.ShiroConfiguration 配置Shiro的安全组件,如SecurityManager
org.apache.shiro.spring.config.ShiroAnnotationProcessorConfiguration 开启Shiro的注解支持

剩下的事情就是配置一个Realm

@Bean
public Realm realm(){
    ...
}

为了能够使用SecurityUtils下的所有方法,最简单的就是为其设置一个SecurityManager,注意不要在Web应用中这样做,详情请看下面

@Autowired
private SecurityManager securityManager;

@PostConstruct
private void initStaticSecurityManager() {
    SecurityUtils.setSecurityManager(securityManager);
}

之后,就可以按照下面的方式获取当前的Subject

SecurityUtils.getSubject();

完整示例查看github

Web 应用

在Web应用中,是通过过滤器的方式来使得请求经过Shiro的,这个过滤器本身非常强大,允许基于任何URL路径表达式执行自定义过滤器链

一样需要在应用程序类路径中包含Shiro Spring的web依赖,推荐使用maven或者gradle

maven

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>

gradle

compile 'org.apache.shiro:shiro-spring:1.7.1'
compile 'org.apache.shiro:shiro-web:1.7.1'
compile 'org.springframework:spring-webmvc:${spring.version}'

接下来导入Shiro-Spring配置

@Configuration
@Import({
    ShiroBeanConfiguration.class,
    ShiroAnnotationProcessorConfiguration.class,
    ShiroWebConfiguration.class,
    ShiroWebFilterConfiguration.class,
    ShiroRequestMappingConfig.class
})
public class ApplicationConfig{
    ...
}

说明如下

配置类 描述
org.apache.shiro.spring.config.ShiroBeanConfiguration 配置Shiro的生命周期和事件
org.apache.shiro.spring.config.ShiroAnnotationProcessorConfiguration 开启Shiro的注解支持
org.apache.shiro.spring.web.config.ShiroWebConfiguration 配置用于web的Shiro的Bean
org.apache.shiro.spring.web.config.ShiroWebFilterConfiguration 配置Shiro的Web过滤器
org.apache.shiro.spring.web.config.ShiroRequestMappingConfig 为Spring配置Shiro的UrlPathHelper实现,确保URL能被正确的处理

然后配置一个Realm

@Bean
public Realm realm() {
    ...
}

最后配置一个ShiroFilterChainDefinition,它包含了特定URL路径及其过滤器链,来控制访问请求

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    
    chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]");
    
    chainDefinition.addPathDefinition("/dosc/**", "authc, perms[document:read]");
    
    chainDefinition.addPathDefinition("/**", "authc");
    
    return chainDefinition;
}

完整示例查看github

开启Shiro注解

无论在Web应用还是非Web应用中,都可以开启Shiro的注解支持,只要导入了ShiroAnnotationProcessorConfigurationSpring配置类即可,然后就可以像下面这样使用Shiro的注解了

@RequiresPermissions("document:read")
public void readDocument() {
    ...
}

注解与Web应用

在@Controller的类中使用Shiro的注解

@Controller
public class AccountInfoController {
    @RequiresRoles("admin")
    @RequestMapping("/admin/config")
    public String adminConfig(Model model){
        return "view";
    }
}

需要一个至少具有一个定义的ShiroFilterChainDefinition bean才能工作,要么配置所有路径通过anon过滤器访问,要么配置一个允许模式的过滤器,例如:authcBasic[permissive]

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    
    // 所有的路径均可以匿名访问
    chainDefinition.addPathDefinition("/**", "anon");
    
    // 或者需要一个HTTP基本认证
    // chainDefinition.addPathDefinition("/**", "authcBasic[permissive]")
    return chainDefinition;
}

缓存

通过配置一个CacheManagerBean来开启缓存

@Bean
protected CacheManager cacheManager() {
    return new MemoryConstrainedCacheManager();
}

配置属性

Key 默认值 描述
shiro.sessionManager.deleteInvalidSessions true 从会话存储区中删除失效会话
shiro.sessionManager.sessionIdCookieEnabled true 将SessionID放到Cookie中,便于追踪
shiro.sessionManager.sessionIdUrlRewritingEnabled true 开启会话URL重写
shiro.userNativeSessionManager false 是否启用Shiro的原生会话管理
shiro.sessionManager.cookie.name JSESSIONID 会话Cookie名字
shiro.sessionManager.cookie.maxAge -1 会话Cookie的有效期
shiro.sessionManager.cookie.domain null 会话Cookie的域
shiro.sessionManager.cookie.path null 会话Cookie的路径
shiro.sessionManager.cookie.secure false 会话Cookie的安全标识
shiro.rememberMeManager.cookie.name rememberMe "记住我"Cookie的名字
shiro.rememberMeManager.cookie.maxAge one year "记住我"Cookie的有效期
shiro.rememberMeManager.cookie.domain null "记住我"Cookie的域名
shiro.rememberMeManager.cookie.path null "记住我"Cookie的路径
shiro.rememberMeManager.cookie.secure false "记住我"Cookie的安全标识
shiro.loginUrl /login.jsp 未认证时重定向到哪个路径
shiro.successUrl / 登陆后默认的跳转界面
shiro.unauthorizedUrl null 没有权限时的错误界面(403页面)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。