web.xml
添加shiro的过滤器:
DelegatingFilterProxy
作用是自动到spring
容器查找名字为shiroFilter
(filter-name)的bean并把所有Filter
的操作委托给它。然后将ShiroFilter
配置到spring
容器即可。
<!-- shiro过虑器 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
shiro-config.xml
使用WEB环境的安全管理器
将在非web环境中使用的安全管理器org.apache.shiro.mgt.DefaultSecurityManager
替换为web环境的安全管理org.apache.shiro.web.mgt.DefaultWebSecurityManager
<!--shiro安全管理器-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="shiroRealm"/>
<property name="cacheManager" ref="cacheManager"/>
</bean>
添加web过滤器
<!-- shiro 的Web过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!--如果没有认证将要跳转的登陆地址 -->
<property name="loginUrl" value="/login"/>
<!-- 配置安全规则 -->
<property name="filterChainDefinitions">
<value>
<!-- 登录页面不拦截 -->
/login anon
<!--静态资源可以直接访问-->
/static/** anon
/upload/** anon
<!-- user表示身份认证通过可以访问 -->
/** user
</value>
</property>
</bean>
用户登录和退出
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
/**
* 执行登录动作
*
* @param username
* @param password
* @return
*/
@PostMapping("/login")
@ResponseBody
public R login(String username, String password) throws Exception {
Subject subject = SecurityUtils.getSubject();
password = MD5Util.md5(password, "ak47");
UsernamePasswordToken token =
new UsernamePasswordToken(username, password);
subject.login(token);
return R.ok();
}
/**
* 退出系统
*
* @return
*/
@GetMapping("/loginout")
public String loginout() {
SecurityUtils.getSubject().logout();
//重定向到登录页面
return "redirect:/login";
}
}