对于“详解spring与shiro集成”的完整攻略,我可以提供以下步骤和代码示例供参考:
1. 添加shiro依赖
在项目的pom文件中,添加shiro的依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.7.1</version>
</dependency>
2. 创建shiro安全配置类
创建一个ShiroConfig类,用于配置shiro的安全策略、realm等:
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 定义过滤器链
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm());
return securityManager;
}
@Bean
public Realm realm() {
return new MyRealm();
}
}
这里使用了一个自定义的MyRealm类作为realm。
3. 实现自定义realm
MyRealm类需要继承AuthorizingRealm,并重写doGetAuthorizationInfo和doGetAuthenticationInfo两个方法。其中,doGetAuthorizationInfo方法用于查询用户的角色和权限信息,而doGetAuthenticationInfo方法用于查询用户的登录认证信息。
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 查询当前用户的角色和权限信息,并存入AuthorizationInfo中
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.addRole("admin");
authorizationInfo.addStringPermission("user:query");
return authorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 查询用户的登录认证信息,并存入AuthenticationInfo中
UsernamePasswordToken upToken = (UsernamePasswordToken)token;
String username = upToken.getUsername();
String password = "123456";
return new SimpleAuthenticationInfo(username, password, getName());
}
}
这里为了简化示例,直接使用了固定的用户名和密码。
4. 配置基于注解的授权
为了方便,在ShiroConfig类中添加一个注解启用授权功能:
@Configuration
@RequiresAuthentication
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ShiroConfig {
// 配置代码省略
}
这样,在需要授权的方法上可以直接使用@RequiresPermissions注解来定义所需的权限:
@Controller
public class UserController {
@GetMapping("/")
@RequiresPermissions("user:query")
public String index() {
return "index";
}
}
这个例子中,当用户访问根路径时,需要具有“user:query”权限才能访问。
5. 配置基于AOP的授权
除了使用注解方式,在ShiroConfig类中可以定义一个Advisor来启用基于AOP的授权功能:
@Configuration
public class ShiroConfig {
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
creator.setProxyTargetClass(true);
return creator;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
// 配置代码省略
}
这样,在需要授权的方法上可以使用@RequiresPermissions注解来定义所需的权限。比如:
@Service
public class UserServiceImpl implements UserService {
@Override
@RequiresPermissions("user:edit")
public void updateUser(User user) {
// 更新用户信息
}
}
这个例子中,当用户调用updateUser方法时,需要具有“user:edit”权限才能调用。
以上就是“详解spring与shiro集成”的完整攻略。希望给你带来帮助。
附上两条示例:
示例1:基于shiro的登录认证功能
@RestController
public class LoginController {
@PostMapping("/login")
public String login(String username, String password) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
return "登录成功";
} catch (AuthenticationException e) {
return "登录失败:" + e.getMessage();
}
}
@GetMapping("/logout")
public String logout() {
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "退出成功";
}
}
示例2:基于shiro的授权功能(注解方式)
@RestController
public class UserController {
@GetMapping("/")
@RequiresPermissions("user:query")
public String index() {
return "index";
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解spring与shiro集成 - Python技术站