Spring Boot 集成 Shiro
在 Spring Boot 中集成 Shiro 需要以下步骤:
- 引入依赖。在
pom.xml
中添加以下依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.7.1</version>
</dependency>
- 配置 Shiro。在配置类中添加以下内容:
```java
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
return shiroFilterFactoryBean;
}
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myRealm());
return securityManager;
}
@Bean
public MyRealm myRealm() {
MyRealm myRealm = new MyRealm();
myRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return myRealm;
}
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
hashedCredentialsMatcher.setHashAlgorithmName("md5");
hashedCredentialsMatcher.setHashIterations(2);
return hashedCredentialsMatcher;
}
}
```
在上述配置中,shirFilter
和 securityManager
是 Shiro 的基本配置,需要注入 SecurityManager
对象。在 SecurityManager
对象中设置 Realm,myRealm
是自定义的 Realm。
- 自定义 Realm。在自定义的 Realm 中实现
doGetAuthenticationInfo
方法验证用户信息和doGetAuthorizationInfo
方法获取用户权限。
自定义密码验证
在自定义的 Realm 中配置验证密码的方式:
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
String username = usernamePasswordToken.getUsername();
// 根据用户名从数据库中获取用户信息
User user = userDao.findByUsername(username);
if (user == null) {
throw new UnknownAccountException();
}
// 密码加密方式
String salt = user.getSalt();
String password = new String(usernamePasswordToken.getPassword());
String encryptPassword = new SimpleHash("md5", password, salt, 2).toHex();
if (!user.getPassword().equals(encryptPassword)) {
throw new IncorrectCredentialsException();
}
return new SimpleAuthenticationInfo(user, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName());
}
}
在上述代码中,使用的是 MD5 加密验证密码,加密方式为:将密码和盐值进行加密,加密次数为 2 次。
自定义 Freemarker 标签根据权限渲染不同页面
在 Freemarker 中自定义标签可以使用 TemplateDirectiveModel
接口。自定义标签需要实现该接口中的 execute
方法来完成标签功能。以下是一个简单的自定义标签。
public class MyTag implements TemplateDirectiveModel {
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
String permission = params.get("permission").toString();
Subject subject = SecurityUtils.getSubject();
if (subject.isPermitted(permission)) {
body.render(env.getOut());
}
}
}
在上述代码中,获取标签参数 permission
和 Subject
对象,利用 isPermitted
方法判断当前用户是否有该权限,如果有则渲染标签体,否则不渲染。
可以将以上的自定义标签添加到 Freemarker 的配置中:
@Configuration
public class FreemarkerConfig {
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
freeMarkerConfigurer.setTemplateLoaderPath("/templates/");
freeMarkerConfigurer.setDefaultEncoding("UTF-8");
// 添加自定义标签
Map<String, Object> freemarkerVariables = new HashMap<>();
freemarkerVariables.put("myTag", new MyTag());
freeMarkerConfigurer.setFreemarkerVariables(freemarkerVariables);
return freeMarkerConfigurer;
}
}
这样就可以在 Freemarker 中使用自定义标签,根据当前用户的权限渲染不同的页面。
示例代码:https://github.com/HaoShiWang/spring-boot-shiro-freemarker
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐 - Python技术站