发表于: 2019-11-09 22:18:15
1 997
一、今天完成的事
1.学习shiro
1.shiro的核心api
subject:用户主体(把操作交给SecurityManager)
SecurityManager:安全管理器(关联Realm)
Realm:Shiro连接数据的桥梁
2.springboot整合shiro
1.导入依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
2.编写自定义的Realm类
public class CustomRealm extends AuthorizingRealm {
/**
* 权限认证,即登录过后,每个身份不一定,对应的所能看的页面也不一样。
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("------执行授权逻辑----------");
return null;
}
/**
* 身份认证。即登录通过账号和密码验证登陆人的身份信息。
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("-------执行认证逻辑--------");
return null;
}
}
3.编写shiro配置类
@Configuration
public class ShiroConfig {
/**
* 一个过滤器,拦截url
* @param securityManager
* @return
*/
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//必须set项
shiroFilterFactoryBean.setSecurityManager(securityManager);
//设置登录页面
shiroFilterFactoryBean.setLoginUrl("/login");
//设置登录成功跳转页面
shiroFilterFactoryBean.setSuccessUrl("/home");
//权限不足跳转的页面
shiroFilterFactoryBean.setUnauthorizedUrl("/login");
//拦截器,下面的属性就是配置不会被拦截的url
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
// authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问,封装在DefaultWebSecurityManager中
filterChainDefinitionMap.put("/home","anon");
//这行代码必须放在所有权限设置的最后,不然会导致所有 url 都被拦截 剩余的都需要认证
filterChainDefinitionMap.put("/student/backDesk", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
//关联Realm
defaultWebSecurityManager.setRealm(customRealm());
return defaultWebSecurityManager;
}
/**
* 创建Realm以便调用
* @return
*/
@Bean
public CustomRealm customRealm() {
return new CustomRealm();
}
}
4.shiro内置过滤器,可以实现权限相关的拦截器
常用的过滤器:
anon:无需验证(登录)可以访问
authc:必须认证才可以访问
user:如果使用remeberMe的而功能可以直接访问
perms:该资源必须得到资源权限才可以访问
role:该资源必须得到角色权限才可以访问
5.实现拦截功能
要拦截的url是localhost:80/student/backDesk,未授权的转态下会跳转到login页面
首页能访问
输入之后跳转到
在自定义的Realm类中加入认证操作
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("-------执行认证逻辑--------");
String username = (String) authenticationToken.getPrincipal();
if (!"javaboy".equals(username)) {
throw new UnknownAccountException("账户不存在!");
}
return new SimpleAuthenticationInfo(username, "123", getName());
}
认证成功能正常跳转到后台
二、遇到的问题
登录页面未成功跳转,验证成功后跳转页面失败。后面断网了没有demo成功
三、收获
四、明天的计划
修改当前bug,再看一下shiro的讲解,小课堂
评论