spring中 shiro logout 配置方式

本文介绍Spring框架中使用Shiro进行用户登出(logout)的两种配置方法:一是通过自定义Action实现;二是利用Shiro提供的LogoutFilter。文章详细展示了如何配置ShiroFilterFactoryBean,并给出了具体的代码示例。
摘要由CSDN通过智能技术生成
spring中 shiro logout 配置方式有两种方式实现logout
1. 普通的action中 实现自己的logout方法,取到Subject,然后logout
 @RequestMapping(value = "${adminPath}/logout", method = RequestMethod.GET)
	public String logout(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
		Principal principal = UserUtils.getPrincipal();
		// 如果已经登录,则跳转到管理首页
		if(principal != null){
			UserUtils.getSubject().logout();
		}
		return "redirect:" + adminPath+"/login";
	}


这种需要在ShiroFilterFactoryBean 中配置 filterChainDefinitions
对应的action的url为anon
<bean name="shiroFilterChainDefinitions" class="java.lang.String">
		<constructor-arg>
			<value>
				/static/** = anon
				/userfiles/** = anon
				${adminPath}/cas = cas
				${adminPath}/login = authc
				${adminPath}/logout = anno
				${adminPath}/** = user
				/act/rest/service/editor/** = perms[act:model:edit]
				/act/rest/service/model/** = perms[act:model:edit]
				/act/rest/service/** = user
				/ReportServer/** = user
			</value>
		</constructor-arg>
	</bean>


2. 使用shiro提供的logout filter 需要定义 相应的bean
<<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" /><!-- 
		<property name="loginUrl" value="${cas.server.url}?service=${cas.project.url}${adminPath}/cas" /> -->
		<property name="loginUrl" value="${adminPath}/login" />
		<property name="successUrl" value="${adminPath}?login" />
		<property name="filters">
            <map>
                <entry key="cas" value-ref="casFilter"/>
                <entry key="authc" value-ref="formAuthenticationFilter"/>
				<entry key="logout" value-ref="logoutFilter" />
            </map>
        </property>
		<property name="filterChainDefinitions">
			<ref bean="shiroFilterChainDefinitions"/>
		</property>
	</bean>


 
 对应在 shiroFilterChainDefinitions中将对应的url改为logout 
     <bean name="shiroFilterChainDefinitions" class="java.lang.String">
		<constructor-arg>
			<value>
				/static/** = anon
				/userfiles/** = anon
				${adminPath}/cas = cas
				${adminPath}/login = authc
				${adminPath}/logout = logout
				${adminPath}/** = user
				/act/rest/service/editor/** = perms[act:model:edit]
				/act/rest/service/model/** = perms[act:model:edit]
				/act/rest/service/** = user
				/ReportServer/** = user
			</value>
		</constructor-arg>
	</bean>
并配置loginFilterbean
<bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter">
   <property name="redirectUrl" value="${adminPath}/login" />
</bean>


Spring Boot 使用 Shiro 配置过滤器有以下几个步骤: 1. 引入 ShiroSpring Boot 的相关依赖: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> ``` 2. 配置 Shiro: 在 Spring Boot ,可以在 application.yml 或 application.properties 文件配置 Shiro。以下是一个 application.yml 的例子: ``` shiro: filter-chain-definition-map: /login: anon /logout: anon /**: authc ``` 这里配置了三个过滤器: - /login:匿名访问,不需要认证和授权。 - /logout:匿名访问,不需要认证和授权。 - /**:需要认证和授权。 3. 配置 ShiroFilterFactoryBean: 在 Spring Boot ,可以通过 ShiroFilterFactoryBean 来配置 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("/logout", "logout"); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } @Bean public DefaultWebSecurityManager securityManager(Realm realm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm); return securityManager; } @Bean public Realm realm() { return new MyRealm(); } } ``` 这里配置了三个过滤器: - /logoutlogout 过滤器用于处理退出登录,不需要认证和授权。 - /login:anon 过滤器用于匿名访问,不需要认证和授权。 - /**:authc 过滤器用于认证和授权。 4. 配置 Realm: 在 Spring Boot ,可以通过实现 Realm 接口来自定义认证和授权逻辑。以下是一个示例: ``` public class MyRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 添加授权信息 authorizationInfo.addRole("admin"); authorizationInfo.addStringPermission("user:list"); return authorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); String password = new String(upToken.getPassword()); // 校验用户名和密码 if ("admin".equals(username) && "123456".equals(password)) { return new SimpleAuthenticationInfo(username, password, getName()); } else { throw new AuthenticationException("用户名或密码错误"); } } } ``` 这里模拟了一个简单的认证和授权逻辑。当用户名和密码为 admin 和 123456 时,认证通过,授权拥有 admin 角色和 user:list 权限。 以上是在 Spring Boot 使用 Shiro 配置过滤器的基本步骤。需要注意的是,Shiro 的过滤器和拦截器是有顺序的,如果顺序不正确,可能会导致一些问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值