`

apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权

 
阅读更多

pache shiro是一个安全认证框架,和spring security相比,在于他使用了比较简洁易懂的认证和授权方式。其提供的native-session(即把用户认证后的授权信息保存在其自身提供Session中)机制,这样就可以和HttpSession、EJB Session Bean的基于容器的Session脱耦,到和客户端应用、Flex应用、远程方法调用等都可以使用它来配置权限认证。 在exit-web-framework里的vcs-admin例子用到该框架,具体使用说明可以参考官方帮助文档。在这里主要讲解如何与spring结合、动态创建filterchaindefinitions、以及认证、授权、和缓存处理。

apache shiro 结合spring

Shiro 拥有对Spring Web 应用程序的一流支持。在Web 应用程序中,所有Shiro 可访问的万恶不请求必须通过一个主要的Shiro 过滤器。该过滤器本身是极为强大的,允许临时的自定义过滤器链基于任何URL 路径表达式执行。 在Shiro 1.0 之前,你不得不在Spring web 应用程序中使用一个混合的方式,来定义Shiro 过滤器及所有它在web.xml中的配置属性,但在Spring XML 中定义SecurityManager。这有些令人沮丧,由于你不能把你的配置固定在一个地方,以及利用更为先进的Spring 功能的配置能力,如PropertyPlaceholderConfigurer 或抽象bean 来固定通用配置。现在在Shiro 1.0 及以后版本中,所有Shiro 配置都是在Spring XML 中完成的,用来提供更为强健的Spring 配置机制。以下是如何在基于Spring web 应用程序中配置Shiro: web.xml:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔 此参数用于后面的Spring Context Loader -->  
  2. <context-param>  
  3.     <param-name>contextConfigLocation</param-name>  
  4.     <param-value>  
  5.         classpath*:/applicationContext-shiro.xml  
  6.     </param-value>  
  7. </context-param>  
  8.   
  9. <!-- shiro security filter -->  
  10. <filter>  
  11.     <!-- 这里的filter-name要和spring的applicationContext-shiro.xml里的  
  12.             org.apache.shiro.spring.web.ShiroFilterFactoryBean的bean name相同 -->  
  13.     <filter-name>shiroSecurityFilter</filter-name>  
  14.     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  15.     <init-param>  
  16.         <param-name>targetFilterLifecycle</param-name>  
  17.         <param-value>true</param-value>  
  18.     </init-param>  
  19. </filter>  
  20.   
  21. <filter-mapping>  
  22.     <filter-name>shiroSecurityFilter</filter-name>  
  23.     <url-pattern>/*</url-pattern>  
  24. </filter-mapping>  


applicationContext-shiro.xml文件中,定义web支持的SecurityManager和"shiroSecurityFilter"bean将会被web.xml 引用。

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <bean id="shiroSecurityFilter">  
  2.     <!-- shiro的核心安全接口 -->  
  3.     <property name="securityManager" ref="securityManager" />  
  4.     <!-- 要求登录时的链接 -->  
  5.     <property name="loginUrl" value="/login.jsp" />  
  6.     <!-- 登陆成功后要跳转的连接 -->  
  7.     <property name="successUrl" value="/index.jsp" />  
  8.     <!-- 未授权时要跳转的连接 -->  
  9.     <property name="unauthorizedUrl" value="/unauthorized.jsp" />  
  10.     <!-- shiro连接约束配置 -->  
  11.     <property name="filterChainDefinitions">  
  12.         <value>  
  13.             /login = authc  
  14.             /logout = logout  
  15.             /resource/** = anon  
  16.         </value>  
  17.     </property>  
  18. </bean>  
  19.   
  20. <bean id="securityManager">  
  21. </bean>  
  22.   
  23. <bean id="lifecycleBeanPostProcessor"/>  


 

启用Shiro注解

在独立应用程序和Web应用程序中,你可能想为安全检查使用Shiro 的注释(例如,@RequiresRoles,@RequiresPermissions 等等)。这需要Shiro 的Spring AOP 集成来扫描合适的注解类以及执行必要的安全逻辑。以下是如何使用这些注解的。只需添加这两个bean 定义到applicationContext-shiro.xml 中:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <bean depends-on="lifecycleBeanPostProcessor"/>  
  2.   
  3. <bean>  
  4.     <property name="securityManager" ref="securityManager"/>  
  5. </bean>  


 

动态创建filterchaindefinitions

有时,在某些系统想通过读取数据库来定义org.apache.shiro.spring.web.ShiroFilterFactoryBean的filterChainDefinitions。这样能够通过操作界面或者维护后台来管理系统的链接。

在shrio与spring集成好了以后,调试源码的高人可能已经注意到。项目启动时,shrio通过自己的org.apache.shiro.spring.web.ShiroFilterFactoryBean类的filterChainDefinitions(授权规则定义)属性转换为一个filterChainDefinitionMap,转换完成后交给ShiroFilterFactoryBean保管。ShiroFilterFactoryBean根据授权(AuthorizationInfo类)后的信息去判断哪些链接能访问哪些链接不能访问。filterChainDefinitionMap里面的键就是链接URL,值就是存在什么条件才能访问该链接,如perms、roles。filterChainDefinitionMap是一个Map,shiro扩展出一个Map的子类Ini.Section

现在有一张表的描述实体类,以及数据访问:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. @Entity  
  2. @Table(name="TB_RESOURCE")  
  3. public class Resource implements Serializable {  
  4.     //主键id  
  5.     @Id  
  6.     private String id;  
  7.     //action url  
  8.     private String value;  
  9.     //shiro permission;  
  10.     private String permission;  
  11.     //------------------Getter/Setter---------------------//  
  12. }  


 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. @Repository  
  2. public class ResourceDao extends BasicHibernateDao<Resource, String> {  
  3.   
  4. }  


通过该类可以知道permission字段和value就是filterChainDefinitionMap的键/值,用spring FactoryBean接口的实现getObject()返回Section给filterChainDefinitionMap即可

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. public class ChainDefinitionSectionMetaSource implements FactoryBean<Ini.Section>{  
  2.   
  3.     @Autowired  
  4.     private ResourceDao resourceDao;  
  5.   
  6.     private String filterChainDefinitions;  
  7.   
  8.     /** 
  9.      * 默认premission字符串 
  10.      */  
  11.     public static final String PREMISSION_STRING="perms[\"{0}\"]";  
  12.   
  13.     public Section getObject() throws BeansException {  
  14.   
  15.         //获取所有Resource  
  16.         List<Resource> list = resourceDao.getAll();  
  17.   
  18.         Ini ini = new Ini();  
  19.         //加载默认的url  
  20.         ini.load(filterChainDefinitions);  
  21.         Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);  
  22.         //循环Resource的url,逐个添加到section中。section就是filterChainDefinitionMap,  
  23.         //里面的键就是链接URL,值就是存在什么条件才能访问该链接  
  24.         for (Iterator<Resource> it = list.iterator(); it.hasNext();) {  
  25.   
  26.             Resource resource = it.next();  
  27.             //如果不为空值添加到section中  
  28.             if(StringUtils.isNotEmpty(resource.getValue()) && StringUtils.isNotEmpty(resource.getPermission())) {  
  29.                 section.put(resource.getValue(),  MessageFormat.format(PREMISSION_STRING,resource.getPermission()));  
  30.             }  
  31.   
  32.         }  
  33.   
  34.         return section;  
  35.     }  
  36.   
  37.     /** 
  38.      * 通过filterChainDefinitions对默认的url过滤定义 
  39.      *  
  40.      * @param filterChainDefinitions 默认的url过滤定义 
  41.      */  
  42.     public void setFilterChainDefinitions(String filterChainDefinitions) {  
  43.         this.filterChainDefinitions = filterChainDefinitions;  
  44.     }  
  45.   
  46.     public Class<?> getObjectType() {  
  47.         return this.getClass();  
  48.     }  
  49.   
  50.     public boolean isSingleton() {  
  51.         return false;  
  52.     }  
  53.   
  54. }  


 

定义好了chainDefinitionSectionMetaSource后修改applicationContext-shiro.xml文件

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <bean id="chainDefinitionSectionMetaSource">  
  2.   
  3.     <property name="filterChainDefinitions">  
  4.         <value>  
  5.             /login = authc  
  6.             /logout = logout  
  7.             /resource/** = anon  
  8.         </value>  
  9.     </property>  
  10. </bean>  
  11.   
  12. <bean id="shiroSecurityFilter">  
  13.     <property name="securityManager" ref="securityManager" />  
  14.     <property name="loginUrl" value="/login.jsp" />  
  15.     <property name="successUrl" value="/index.jsp" />  
  16.     <property name="unauthorizedUrl" value="/unauthorized.jsp" />  
  17.     <!-- shiro连接约束配置,在这里使用自定义的动态获取资源类 -->  
  18.     <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />  
  19. </bean>  
  20.   
  21. <bean id="securityManager">  
  22. </bean>  
  23.   
  24. <bean id="lifecycleBeanPostProcessor"/>  


 

shiro数据库认证、授权

在shiro认证和授权主要是两个类,就是org.apache.shiro.authc.AuthenticationInfo和org.apache.shiro.authz.AuthorizationInfo。该两个类的处理在org.apache.shiro.realm.AuthorizingRealm中已经给出了两个抽象方法。就是:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. /** 
  2.  * Retrieves the AuthorizationInfo for the given principals from the underlying data store.  When returning 
  3.  * an instance from this method, you might want to consider using an instance of 
  4.  * {@link org.apache.shiro.authz.SimpleAuthorizationInfo SimpleAuthorizationInfo}, as it is suitable in most cases. 
  5.  * 
  6.  * @param principals the primary identifying principals of the AuthorizationInfo that should be retrieved. 
  7.  * @return the AuthorizationInfo associated with this principals. 
  8.  * @see org.apache.shiro.authz.SimpleAuthorizationInfo 
  9.  */  
  10. protected abstract AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals);  
  11.   
  12. /** 
  13.  * Retrieves authentication data from an implementation-specific datasource (RDBMS, LDAP, etc) for the given 
  14.  * authentication token. 
  15.  * <p/> 
  16.  * For most datasources, this means just 'pulling' authentication data for an associated subject/user and nothing 
  17.  * more and letting Shiro do the rest.  But in some systems, this method could actually perform EIS specific 
  18.  * log-in logic in addition to just retrieving data - it is up to the Realm implementation. 
  19.  * <p/> 
  20.  * A {@code null} return value means that no account could be associated with the specified token. 
  21.  * 
  22.  * @param token the authentication token containing the user's principal and credentials. 
  23.  * @return an {@link AuthenticationInfo} object containing account data resulting from the 
  24.  *         authentication ONLY if the lookup is successful (i.e. account exists and is valid, etc.) 
  25.  * @throws AuthenticationException if there is an error acquiring data or performing 
  26.  *                                 realm-specific authentication logic for the specified <tt>token</tt> 
  27.  */  
  28. protected abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException;  


 

doGetAuthenticationInfo(AuthenticationToken token)(认证/登录方法)会返回一个AuthenticationInfo,就是认证信息。是一个对执行及对用户的身份验证(登录)尝试负责的方法。当一个用户尝试登录时,该逻辑被认证器执行。认证器知道如何与一个或多个Realm协调来存储相关的用户/帐户信息。从这些Realm中获得的数据被用来验证用户的身份来保证用户确实是他们所说的他们是谁。

doGetAuthorizationInfo(PrincipalCollection principals)是负责在应用程序中决定用户的访问控制的方法。它是一种最终判定用户是否被允许做某件事的机制。与doGetAuthenticationInfo(AuthenticationToken token)相似,doGetAuthorizationInfo(PrincipalCollection principals) 也知道如何协调多个后台数据源来访问角色恶化权限信息和准确地决定用户是否被允许执行给定的动作。

简单的一个用户和一个资源实体:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. @Entity  
  2. @Table(name="TB_RESOURCE")  
  3. public class Resource implements Serializable {  
  4.     //主键id  
  5.     @Id  
  6.     private String id;  
  7.     //action url  
  8.     private String value;  
  9.     //shiro permission;  
  10.     private String permission;  
  11.     //------------------Getter/Setter---------------------//  
  12. }  


 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. @Entity  
  2. @Table(name="TB_USER")  
  3. @SuppressWarnings("serial")  
  4. public class User implements Serializable {  
  5.     //主键id  
  6.     @Id  
  7.     private String id;  
  8.     //登录名称  
  9.     private String username;  
  10.     //登录密码  
  11.     private String password;  
  12.     //拥有能访问的资源/链接()  
  13.     private List<Resource> resourcesList = new ArrayList<Resource>();  
  14.     //-------------Getter/Setter-------------//  
  15. }  


 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. @Repository  
  2. public class UserDao extends BasicHibernateDao<User, String> {  
  3.   
  4.     public User getUserByUsername(String username) {  
  5.         return findUniqueByProperty("username", username);  
  6.     }  
  7.   
  8. }  


 

实现org.apache.shiro.realm.AuthorizingRealm中已经给出了两个抽象方法:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. public class ShiroDataBaseRealm extends AuthorizingRealm{  
  2.   
  3.     @Autowired  
  4.     private UserDao userDao;  
  5.   
  6.     /** 
  7.      *  
  8.      * 当用户进行访问链接时的授权方法 
  9.      *  
  10.      */  
  11.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
  12.   
  13.         if (principals == null) {  
  14.             throw new AuthorizationException("Principal对象不能为空");  
  15.         }  
  16.   
  17.         User user = (User) principals.fromRealm(getName()).iterator().next();  
  18.   
  19.         //获取用户响应的permission  
  20.         List<String> permissions = CollectionUtils.extractToList(user.getResourcesList(), "permission",true);  
  21.   
  22.         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();  
  23.   
  24.         info.addStringPermissions(permissions);  
  25.   
  26.         return info;  
  27.     }  
  28.   
  29.     /** 
  30.      * 用户登录的认证方法 
  31.      *  
  32.      */  
  33.     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {  
  34.         UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;  
  35.   
  36.         String username = usernamePasswordToken.getUsername();  
  37.   
  38.         if (username == null) {  
  39.             throw new AccountException("用户名不能为空");  
  40.         }  
  41.   
  42.         User user = userDao.getUserByUsername(username);  
  43.   
  44.         if (user == null) {  
  45.             throw new UnknownAccountException("用户不存在");  
  46.         }  
  47.   
  48.         return new SimpleAuthenticationInfo(user,user.getPassword(),getName());  
  49.     }  
  50. }  


 

定义好了ShiroDataBaseRealm后修改applicationContext-shiro.xml文件

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <bean id="chainDefinitionSectionMetaSource">  
  2.   
  3.     <property name="filterChainDefinitions">  
  4.         <value>  
  5.             /login = authc  
  6.             /logout = logout  
  7.             /resource/** = anon  
  8.         </value>  
  9.     </property>  
  10. </bean>  
  11.   
  12. <bean id="shiroSecurityFilter">  
  13.     <property name="securityManager" ref="securityManager" />  
  14.     <property name="loginUrl" value="/login.jsp" />  
  15.     <property name="successUrl" value="/index.jsp" />  
  16.     <property name="unauthorizedUrl" value="/unauthorized.jsp" />  
  17.     <!-- shiro连接约束配置,在这里使用自定义的动态获取资源类 -->  
  18.     <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />  
  19. </bean>  
  20.   
  21. <bean id="shiroDataBaseRealm">  
  22.     <!-- MD5加密 -->  
  23.     <property name="credentialsMatcher">  
  24.         <bean>  
  25.             <property name="hashAlgorithmName" value="MD5" />  
  26.         </bean>  
  27.     </property>  
  28. </bean>  
  29.   
  30. <bean id="securityManager">  
  31.     <property name="realm" ref="shiroDataBaseRealm" />  
  32. </bean>  
  33.   
  34. <bean id="lifecycleBeanPostProcessor"/>  


 

 

shiro EHcache 与 Spring EHcache集成

shiro CacheManager创建并管理其他Shiro组件使用的Cache实例生命周期。因为Shiro能够访问许多后台数据源,如:身份验证,授权和会话管理,缓存在框架中一直是一流的架构功能,用来在同时使用这些数据源时提高性能。任何现代开源和/或企业的缓存产品能够被插入到Shiro 来提供一个快速及高效的用户体验。

自从spring 3.1问世后推出了缓存功能后,提供了对已有的 Spring 应用增加缓存的支持,这个特性对应用本身来说是透明的,通过缓存抽象层,使得对已有代码的影响降低到最小。

该缓存机制针对于 Java 的方法,通过给定的一些参数来检查方法是否已经执行,Spring 将对执行结果进行缓存,而无需再次执行方法。

可通过下列配置来启用缓存的支持:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:cache="http://www.springframework.org/schema/cache"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

    <!-- 使用缓存annotation 配置 -->
    <cache:annotation-driven cache-manager="ehCacheManager" />

</beans>

@Cacheable和**@CacheEvict**来对缓存进行操作

@Cacheable:负责将方法的返回值加入到缓存中

@CacheEvict:负责清除缓存

/**声明了一个名为 persons 的缓存区域,当调用该方法时,Spring 会检查缓存中是否存在 personId 对应的值。*/
@Cacheable("persons")
public Person profile(Long personId) { ... }

/**指定多个缓存区域。Spring 会一个个的检查,一旦某个区域存在指定值时则返回*/
@Cacheable({"persons", "profiles"})
public Person profile(Long personId) { ... }
</code>
</pre>

<pre>
<code>
/**清空所有缓存*/
@CacheEvict(value="persons",allEntries=true)
public Person profile(Long personId, Long groundId) { ... }

/**或者根据条件决定是否缓存*/
@CacheEvict(value="persons", condition="personId > 50")
public Person profile(Long personId) { ... }

在shiro里面会有授权缓存。可以通过AuthorizingRealm类中指定缓存名称。就是authorizationCacheName属性。当shiro为用户授权一次之后将会把所有授权信息都放进缓存中。现在有个需求。当在更新用户或者删除资源和更新资源的时候,要刷新一下shiro的授权缓存,给shiro重新授权一次。因为当更新用户或者资源时,很有可能已经把用户本身已有的资源去掉。不给用户访问。所以。借助spring的缓存工厂和shiro的缓存能够很好的实现这个需求。

将applicationContext-shiro.xml文件添加缓存

<bean id="chainDefinitionSectionMetaSource">
    <property name="filterChainDefinitions" >
        <value>
            /login = authc
            /logout = logout
            /resource/** = anon
        </value>
    </property>
</bean>

<bean id="shiroSecurityFilter">
    <property name="securityManager" ref="securityManager" />
    <property name="loginUrl" value="/login.jsp" />
    <property name="successUrl" value="/index.jsp" />
    <property name="unauthorizedUrl" value="/unauthorized.jsp" />
    <!-- shiro连接约束配置,在这里使用自定义的动态获取资源类 -->
    <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />
</bean>

<bean id="shiroDataBaseRealm">
    <!-- MD5加密 -->
    <property name="credentialsMatcher">
        <bean>
            <property name="hashAlgorithmName" value="MD5" />
        </bean>
    </property>
    <property name="authorizationCacheName" value="shiroAuthorizationCache" />
</bean>

<bean id="securityManager">
    <property name="realm" ref="shiroDataBaseRealm" />
    <property name="cacheManager" ref="cacheManager" />
</bean>

<bean id="lifecycleBeanPostProcessor"/>

<!-- 使用缓存annotation 配置 --/>
<cache:annotation-driven cache-manager="ehCacheManager" />

<!-- spring对ehcache的缓存工厂支持 -->
<bean id="ehCacheManagerFactory">
    <property name="configLocation" value="classpath:ehcache.xml" />
    <property name="shared" value="false" />
</bean>

<!-- spring对ehcache的缓存管理 -->
<bean id="ehCacheManager">
    <property name="cacheManager" ref="ehCacheManagerFactory"></property>
</bean>

<!-- shiro对ehcache的缓存管理直接使用spring的缓存工厂 -->
<bean id="cacheManager"> 
    <property name="cacheManager" ref="ehCacheManagerFactory" />
</bean>

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>  
    <!--
            maxElementsInMemory为缓存对象的最大数目, 
            eternal设置是否永远不过期,
            timeToIdleSeconds对象处于空闲状态的最多秒数,
            timeToLiveSeconds对象处于缓存状态的最多秒数 
     -->
    <diskStore path="java.io.tmpdir"/>

    <cache name="shiroAuthorizationCache" maxElementsInMemory="300" eternal="false" timeToLiveSeconds="600" overflowToDisk="false"/>

</ehcache>

 


 

public class UserDao extends BasicHibernateDao<User, String> {

    public User getUserByUsername(String username) {
        return findUniqueByProperty("username", username);
    }

    @CacheEvict(value="shiroAuthorizationCache",allEntries=true)
    public void saveUser(User entity) {
        save(entity);
    }

}

 


 

@Repository
public class ResourceDao extends BasicHibernateDao<Resource, String> {

    @CacheEvict(value="shiroAuthorizationCache",allEntries=true)
    public void saveResource(Resource entity) {
        save(entity);
    }

    @CacheEvict(value="shiroAuthorizationCache",allEntries=true)
    public void deleteResource(Resource entity) {
        delete(entity);
    }
}

当userDao或者reaourceDao调用了相应带有缓存注解的方法,都会将AuthorizingRealm类中的缓存去掉。那么就意味着 shiro在用户访问链接时要重新授权一次。

整个apache shiro的使用,vcs admin项目和vcs admin jpa中都会有例子。可以参考showcase/vcs_admin或者showcase/vcs_admin_jpa项目中的例子去理解。。

 

http://www.jszuofang.com/apache-shiro-spring-integration-dynamic-filterchaindefinitions-and-authentication-authorization.html

分享到:
评论

相关推荐

    级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均衡管理,级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均

    级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均衡管理,级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均衡管理,不平衡电网下的svg无功补偿,级联H桥svg无功补偿statcom,采用三层控制策略。 (1)第一层采用电压电流双闭环pi控制,电压电流正负序分离,电压外环通过产生基波正序有功电流三相所有H桥模块直流侧平均电压恒定,电流内环采用前馈解耦控制; (2)第二层相间电压均衡控制,注入零序电压,控制通过注入零序电压维持相间电压平衡; (3)第三层相内电压均衡控制,使其所有子模块吸收的有功功率与其损耗补,从而保证所有H桥子模块直流侧电压值等于给定值。 有参考资料。 639,核心关键词: 1. 不平衡电网下的SVG无功补偿 2. 级联H桥SVG无功补偿STATCOM 3. 三层控制策略 4. 电压电流双闭环PI控制 5. 电压电流正负序分离 6. 直流侧平均电压恒定 7. 前馈解耦控制 8. 相间电压均衡控制 9. 零序电压注入 10. 相内电压均衡控制 以上十个关键词用分号分隔的格式为:不

    GTX 1080 PCB图纸

    GTX 1080 PCB图纸,内含图纸查看软件

    深度优化与应用:提升DeepSeek润色指令的有效性和灵活性指南

    内容概要:本文档详细介绍了利用 DeepSeek 进行文本润色和问答交互时提高效果的方法和技巧,涵盖了从明确需求、提供适当上下文到尝试开放式问题以及多轮对话的十个要点。每一部分内容都提供了具体的示范案例,如指定回答格式、分步骤提问等具体实例,旨在指导用户更好地理解和运用 DeepSeek 提升工作效率和交流质量。同时文中还强调了根据不同应用场景调整提示词语气和风格的重要性和方法。 适用人群:适用于希望通过优化提问技巧以获得高质量反馈的企业员工、科研人员以及一般公众。 使用场景及目标:本文针对所有期望提高 DeepSeek 使用效率的人群,帮助他们在日常工作中快速获取精准的答案或信息,特别是在撰写报告、研究材料准备和技术咨询等方面。此外还鼓励用户通过不断尝试不同形式的问题表述来进行有效沟通。 其他说明:该文档不仅关注实际操作指引,同样重视用户思维模式转变——由简单索取答案向引导 AI 辅助创造性解决问题的方向发展。

    基于FPGA与W5500实现的TCP网络通信测试平台开发-Zynq扩展口Verilog编程实践,基于FPGA与W5500芯片的TCP网络通信测试及多路Socket实现基于zynq开发平台和Vivad

    基于FPGA与W5500实现的TCP网络通信测试平台开发——Zynq扩展口Verilog编程实践,基于FPGA与W5500芯片的TCP网络通信测试及多路Socket实现基于zynq开发平台和Vivado 2019软件的扩展开发,基于FPGA和W5500的TCP网络通信 测试平台 zynq扩展口开发 软件平台 vivado2019.2,纯Verilog可移植 测试环境 压力测试 cmd命令下ping电脑ip,同时采用上位机进行10ms发包回环测试,不丢包(内部数据回环,需要时间处理) 目前实现单socket功能,多路可支持 ,基于FPGA; W5500; TCP网络通信; Zynq扩展口开发; 纯Verilog可移植; 测试平台; 压力测试; 10ms发包回环测试; 单socket功能; 多路支持。,基于FPGA与W5500的Zynq扩展口TCP通信测试:可移植Verilog实现的高效网络通信

    Labview液压比例阀伺服阀试验台多功能程序:PLC通讯、液压动画模拟、手动控制与调试、传感器标定、报警及记录、自动实验、数据处理与查询存储,报表生成与打印一体化解决方案 ,Labview液压比例阀

    Labview液压比例阀伺服阀试验台多功能程序:PLC通讯、液压动画模拟、手动控制与调试、传感器标定、报警及记录、自动实验、数据处理与查询存储,报表生成与打印一体化解决方案。,Labview液压比例阀伺服阀试验台多功能程序:PLC通讯、液压动画模拟、手动控制与调试、传感器标定、报警管理及实验自动化,labview液压比例阀伺服阀试验台程序:功能包括,同PLC通讯程序,液压动画,手动控制及调试,传感器标定,报警设置及报警记录,自动实验,数据处理曲线处理,数据库存储及查询,报表自动生成及打印,扫码枪扫码及信号录入等~ ,核心关键词:PLC通讯; 液压动画; 手动控制及调试; 传感器标定; 报警设置及记录; 自动实验; 数据处理及曲线处理; 数据库存储及查询; 报表生成及打印; 扫码枪扫码。,Labview驱动的智能液压阀测试系统:多功能控制与数据处理

    华为、腾讯、万科员工职业发展体系建设与实践.pptx

    华为、腾讯、万科员工职业发展体系建设与实践.pptx

    基于遗传算法的柔性车间调度优化 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    电网不对称故障下VSG峰值电流限制的柔性控制策略:实现电流平衡与功率容量的优化利用,电网不对称故障下VSG峰值电流限制的柔性控制策略:兼顾平衡电流与功率控制切换的动态管理,电网不对称故障下VSG峰值电

    电网不对称故障下VSG峰值电流限制的柔性控制策略:实现电流平衡与功率容量的优化利用,电网不对称故障下VSG峰值电流限制的柔性控制策略:兼顾平衡电流与功率控制切换的动态管理,电网不对称故障下VSG峰值电流限制的柔性不平衡控制(文章完全复现)。 提出一种在不平衡运行条件下具有峰值电流限制的可变不平衡电流控制方法,可灵活地满足不同操作需求,包括电流平衡、有功或无功恒定运行(即电流控制、有功控制或无功控制之间的相互切),注入电流保持在安全值内,以更好的利用VSG功率容量。 关键词:VSG、平衡电流控制、有功功率控制、无功功率控制。 ,VSG; 峰值电流限制; 柔性不平衡控制; 电流平衡控制; 有功功率控制; 无功功率控制。,VSG柔性控制:在电网不对称故障下的峰值电流限制与平衡管理

    libpinyin-tools-0.9.93-4.el7.x64-86.rpm.tar.gz

    1、文件内容:libpinyin-tools-0.9.93-4.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/libpinyin-tools-0.9.93-4.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

    机器学习(预测模型):动漫《龙珠》相关的数据集

    数据集是一个以经典动漫《龙珠》为主题的多维度数据集,广泛应用于数据分析、机器学习和图像识别等领域。该数据集由多个来源整合而成,涵盖了角色信息、战斗力、剧情片段、台词以及角色图像等多个方面。数据集的核心内容包括: 角色信息:包含《龙珠》系列中的主要角色及其属性,如名称、种族、所属系列(如《龙珠》《龙珠Z》《龙珠超》等)、战斗力等级等。 图像数据:提供角色的图像资源,可用于图像分类和角色识别任务。这些图像来自动画剧集、漫画和相关衍生作品。 剧情与台词:部分数据集还包含角色在不同故事中的台词和剧情片段,可用于文本分析和自然语言处理任务。 战斗数据:记录角色在不同剧情中的战斗力变化和战斗历史,为研究角色成长和剧情发展提供支持。 数据集特点 多样性:数据集整合了角色、图像、文本等多种类型的数据,适用于多种研究场景。 深度:不仅包含角色的基本信息,还涵盖了角色的成长历程、技能描述和与其他角色的互动关系。 实用性:支持多种编程语言(如Python、R)的数据处理和分析,提供了详细的文档和示例代码。

    基于protues仿真的多功公交站播报系统设计(仿真图、源代码)

    基于protues仿真的多功公交站播报系统设计(仿真图、源代码) 该设计为基于protues仿真的多功公交站播报系统,实现温度显示、时间显示、和系统公交站播报功能; 具体功能如下: 1、系统使用51单片机为核心设计; 2、时钟芯片进行时间和日期显示; 3、温度传感器进行温度读取; 4、LCD12864液晶屏进行相关显示; 5、按键设置调节时间; 6、按键设置报站; 7、仿真图、源代码; 操作说明: 1、下行控制报站:首先按下(下行设置按键),(下行指示灯)亮,然后按下(手动播报)按键控制播报下一站; 2、上行控制报站:首先按上(上行设置按键),(上行指示灯)亮,然后按下(手动播报)按键控制播报下一站; 3、按下关闭播报按键,则关闭播报功能和清除显示

    基于微信小程序的琴房管理系统的设计与实现.zip

    采用Java后台技术和MySQL数据库,在前台界面为提升用户体验,使用Jquery、Ajax、CSS等技术进行布局。 系统包括两类用户:学生、管理员。 学生用户 学生用户只要实现了前台信息的查看,打开首页,查看网站介绍、琴房信息、在线留言、轮播图信息公告等,通过点击首页的菜单跳转到对应的功能页面菜单,包括网站首页、琴房信息、注册登录、个人中心、后台登录。 学生用户通过账户账号登录,登录后具有所有的操作权限,如果没有登录,不能在线预约。学生用户退出系统将注销个人的登录信息。 管理员通过后台的登录页面,选择管理员权限后进行登录,管理员的权限包括轮播公告管理、老师学生信息管理和信息审核管理,管理员管理后点击退出,注销登录信息。 管理员用户具有在线交流的管理,琴房信息管理、琴房预约管理。 在线交流是对前台用户留言内容进行管理,删除留言信息,查看留言信息。

    界面GUI设计MATLAB教室人数统计.zip

    MATLAB可以用于开发人脸识别考勤系统。下面是一个简单的示例流程: 1. 数据采集:首先收集员工的人脸图像作为训练数据集。可以要求员工提供多张照片以获得更好的训练效果。 2. 图像预处理:使用MATLAB的图像处理工具对采集到的人脸图像进行预处理,例如灰度化、裁剪、缩放等操作。 3. 特征提取:利用MATLAB的人脸识别工具包,如Face Recognition Toolbox,对处理后的图像提取人脸特征,常用的方法包括主成分分析(PCA)和线性判别分析(LDA)等。 4. 训练模型:使用已提取的人脸特征数据集训练人脸识别模型,可以选择支持向量机(SVM)、卷积神经网络(CNN)等算法。 5. 考勤系统:在员工打卡时,将摄像头捕获的人脸图像输入到训练好的模型中进行识别,匹配员工信息并记录考勤数据。 6. 结果反馈:根据识别结果,可以自动生成考勤报表或者实时显示员工打卡情况。 以上只是一个简单的步骤,实际开发过程中需根据具体需求和系统规模进行定制和优化。MATLAB提供了丰富的图像处理和机器学习工具,是开发人脸识别考勤系统的一个很好选择。

    hjbvbnvhjhjg

    hjbvbnvhjhjg

    HCIP、软考相关学习PPT

    HCIP、软考相关学习PPT提供下载

    绿豆BOX UI8版:反编译版六个全新UI+最新后台直播管理源码

    绿豆BOX UI8版:反编译版六个全新UI+最新后台直播管理源码 最新绿豆BOX反编译版六个UI全新绿豆盒子UI8版本 最新后台支持直播管理 作为UI6的升级版,UI8不仅修复了前一版本中存在的一些BUG,还提供了6套不同的UI界面供用户选择,该版本有以下特色功能: 在线管理TVBOX解析 在线自定义TVBOX 首页布局批量添加会员信息 并支持导出批量生成卡密 并支持导出直播列表管理功能

    vue3的一些语法以及知识点

    vue3的一些语法以及知识点

    西门子大型Fanuc机器人汽车焊装自动生产线程序经典解析:PLC博图编程与MES系统通讯实战指南,西门子PLC博图汽车焊装自动生产线FANUC机器人程序经典结构解析与MES系统通讯,西门子1500 大

    西门子大型Fanuc机器人汽车焊装自动生产线程序经典解析:PLC博图编程与MES系统通讯实战指南,西门子PLC博图汽车焊装自动生产线FANUC机器人程序经典结构解析与MES系统通讯,西门子1500 大型程序fanuc 机器人汽车焊装自动生产线程序 MES 系统通讯 大型程序fanuc机器人汽车焊装自动生产线程序程序经典结构清晰,SCL算法堆栈,梯形图和 SCL混编使用博图 V14以上版本打开 包括: 1、 PLC 博图程序 2 触摸屏程序 ,西门子1500; 大型程序; fanuc机器人; 汽车焊装自动生产线; MES系统通讯; SCL算法; 梯形图; SCL混编; 博图V14以上版本。,西门子博图大型程序:汽车焊装自动生产线MES系统通讯与机器人控制

    DeepSeek:从入门到精通

    DeepSeek:从入门到精通

    计及信息间隙决策与多能转换的综合能源系统优化调度模型:实现碳经济最大化与源荷不确定性考量,基于信息间隙决策与多能转换的综合能源系统优化调度模型:源荷不确定性下的高效碳经济调度策略,计及信息间隙决策及多

    计及信息间隙决策与多能转换的综合能源系统优化调度模型:实现碳经济最大化与源荷不确定性考量,基于信息间隙决策与多能转换的综合能源系统优化调度模型:源荷不确定性下的高效碳经济调度策略,计及信息间隙决策及多能转的综合能源系统优化调度 本代码构建了含风电、光伏、光热发电系统、燃气轮机、燃气锅炉、电锅炉、储气、储电、储碳、碳捕集装置的综合能源系统优化调度模型,并考虑P2G装置与碳捕集装置联合运行,从而实现碳经济的最大化,最重要的是本文引入了信息间隙决策理论考虑了源荷的不确定性(本代码的重点)与店铺的47代码形成鲜明的对比,注意擦亮眼睛,认准原创,该代码非常适合修改创新,,提供相关的模型资料 ,计及信息间隙决策; 综合能源系统; 优化调度; 多能转换; 碳经济最大化; 风电; 光伏; 燃气轮机; 储气; 储电; 储碳; 碳捕集装置; P2G装置联合运行; 模型资料,综合能源系统优化调度模型:基于信息间隙决策和多能转换的原创方案

Global site tag (gtag.js) - Google Analytics