我们这里通过shiro来进行权限控制,今天要讲的就是在springboot中配置shiro。
1、引入shiro包
第一个是shiro的核心包,第二个是freemarker上使用shiro标签的包
compile('org.apache.shiro:shiro-spring:1.3.2')
compile('net.mingsoft:shiro-freemarker-tags:0.1')
2、自定义CustomRealm
public class CustomRealm extends AuthorizingRealm {
private static final Logger logger = LoggerFactory.getLogger(CustomRealm.class);
@Autowired
private UserService userService;
/**
* 获取身份验证信息
* Shiro中,最终是通过 Realm 来获取应用程序中的用户、角色及权限信息的。
*
* @param authenticationToken 用户身份信息 token
* @return 返回封装了用户信息的 AuthenticationInfo 实例
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
logger.info("————身份认证方法————");
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
// 从数据库获取对应用户名密码的用户
String password = userService.getPassword(token.getUsername());
if (null == password) {
throw new AccountException("用户名不正确");
} else if (!password.equals(new String((char[]) token.getCredentials()))) {
throw new AccountException("密码不正确");
}
return new SimpleAuthenticationInfo(token.getPrincipal(), password, getName());
}
/**
* 获取授权信息
*
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
logger.info("————权限认证————");
String username = (String) SecurityUtils.getSubject().getPrincipal();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//获得该用户角色
String role = userService.getUserRole(username);
logger.info(username + "的角色为:" + role);
String[] split = role.split(",");
Set<String> set = new HashSet<>();
for (String ro : split) {
//需要将 role 封装到 Set 作为 info.setRoles() 的参数
set.add(ro);
}
//设置该用户拥有的角色
info.setRoles(set);
return info;
}
}
/**
* freemarker集成Shiro标签
*/
@Component
public class ShiroTagFreeMarkerConfigurer implements InitializingBean {
@Autowired
private Configuration configuration;
@Autowired
private FreeMarkerViewResolver resolver;
@Override
public void afterPropertiesSet() throws Exception {
// 加上这句后,可以在页面上使用shiro标签
configuration.setSharedVariable("shiro", new ShiroTags());
// 加上这句后,可以在页面上用${context.contextPath}获取contextPath
resolver.setRequestContextAttribute("context");
}
}
/**
* shiro 权限配置类
* Created by 493858256qq.com on 2019/8/9.
*/
@Configuration
public class ShiroConfig {
private static final Logger logger = LoggerFactory.getLogger(ShiroConfig.class);
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 必须设置 SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
// setLoginUrl 如果不设置值,默认会自动寻找Web工程根目录下的"/login.jsp"页面 或 "/login" 映射
shiroFilterFactoryBean.setLoginUrl("/login/login");
// 设置无权限时跳转的 url;
shiroFilterFactoryBean.setUnauthorizedUrl("/login/login");
// 设置拦截器
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
//游客,开发权限
filterChainDefinitionMap.put("/guest/**", "anon");
//用户,需要角色权限 “user”
//管理员,需要角色权限 “admin”
filterChainDefinitionMap.put("/manager/**", "roles[user]");
//开放登陆接口
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
//其余接口一律拦截
//主要这行代码必须放在所有权限设置的最后,不然会导致所有 url 都被拦截
filterChainDefinitionMap.put("/**", "anon");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
logger.info("Shiro拦截器工厂类注入成功");
return shiroFilterFactoryBean;
}
/**
* 注入 securityManager
*/
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置realm.
securityManager.setRealm(customRealm());
return securityManager;
}
/**
* 自定义身份认证 realm;
* <p>
* 必须写这个类,并加上 @Bean 注解,目的是注入 CustomRealm,
* 否则会影响 CustomRealm类 中其他类的依赖注入
*/
@Bean
public CustomRealm customRealm() {
return new CustomRealm();
}
}
3、在html中使用shiro标签来进行控制菜单显示,比如admin角色可以显示首页
<@shiro.hasRole name="admin">
<li><a class="menu" href="index.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >首页</a></li>
</@shiro.hasRole>
<li><a class="menu" href="index.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >个人资料</a></li>
欢迎转载,转载请注明出处 https://www.dingyinwu.com/article/74.html
如果文章中有任何问题或者可以改进的地方,请大家多提提意见,我会非常感激。