初学shiro出现setLoginUrl方法不起作用,即未登录也可访问到其他网页,正常情况下应该会直接跳转到指定的登录页面。最后发现是没设定好setFilterChainDefinitionMap里的map。应当设置如下:
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("mySecurityManager") SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String, String> map = new HashMap<>();
/*
anon: 无需认证就可以访问
authc: 必须认证了才能访问
user: 必须拥有 记住我 功能才能用
perms: 拥有对某个资源的权限才能访问
role: 拥有某个角色权限才能访问
*/
//对所有请求都需要认证,除了login
map.put("/**", "authc");
map.put("/login","anon");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
//登录
shiroFilterFactoryBean.setLoginUrl("/toLogin");
//首页
shiroFilterFactoryBean.setSuccessUrl("/index");
//错误页面,认证不通过跳转
shiroFilterFactoryBean.setUnauthorizedUrl("/unauth");
return shiroFilterFactoryBean;
}
代码map.put("/**", "authc")使得所有请求都需要认证才能请求成功,否则就跳转至setLoginUrl中指定的页面,同时为了使登录页面可以在未登陆时请求成功,需要用代码map.put("/login","anon")进行设置。