SpringBoot 整合 Shiro 密码登录的实现代码

网友投稿 544 2023-02-09

SpringBoot 整合 Shiro 密码登录的实现代码

SpringBoot 整合 Shiro 密码登录的实现代码

导入依赖(pom.xml)

org.apache.shiro

shiro-spring

1.4.0

com.auth0

java-jwt

3.2.0

创建 ShiroConfig 配置类

@Configuration

public class ShiroConfig {

/**

* ShiroFilterFactoryBean

*/

@Bean

public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager) {

ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();

//设置安全管理

factoryBean.setSecurityManager(defaultWebSecurityManager);

// 添加shiro的内置过滤器

/*

* anon:无需认证就可以访问

* authc:必须认证才能访问

* user:必须拥有 记住我 功能才能用

* perms:拥有对某个资源的权限能访问

* role:拥有某个角色权限能访问

*/

Map filterMap = new LinkedHashMap<>();

// 放行不需要权限认证的接口

//放行登录接口

filterMap.put("/login/**", "anon");

//放行用户接口

filterMap.put("/", "anon"); // 网站首页

//认证管理员接口

filterMap.put("/administrators/**", "authc");

factoryBean.setFilterChainDefinitionMap(filterMap);

// 设置无权限时跳转的 url

// 设置登录的请求

factoryBean.setLoginUrl("/login/toLogin");

return factoryBean;

}

/**

* 注入 DefaultWebSecurityManager

*/

@Bean(name = "securityManager")

public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("customRealm") CustomRealm customRealm) {

DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

//关联CustomRealm

securityManager.setRealm(customRealm);

return securityManager;

}

/**

* 注入 securityManager

*/

@Bean

public CustomRealm customRealm() {

return new CustomRealm();

}

}

创建密码登录时验证授权 CustomRealm 类

@Component

public class CustomRealm extends AuthorizingRealm {

@Autowired

AdministratorsService administratorsService;

/*

* 设置加密方式

*/

{

HashedCredentialsMatcher mather = new HashedCredentialsMatcher();

// 加密方式

mather.setHashAlgorithmName("md5");

// 密码进行一次运算

mather.setHashIterations(512);

this.setCredentialsMatcher(mather);

}

/**

* 授权

*/

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

System.out.println("————授权————doGetAuthorizationInfo————");

return null;

}

/**

* 认证

*/

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

System.out.println("————认证————doGetAuthenticationInfo————");

UsernamePasswordToken userToken = (UsernamePasswordToken) token;

// 连接数据库 查询用户数据

QueryWrapper wrapper = new QueryWrapper<>();

wrapper.eq("username", userToken.getUsername());

Administrators administrators = administratorsService.getOne(wrapper);

if (administrators == null) {

return null; // 抛出异常 UnknownAccountException

}

// 密码认证,shiro做

return new SimpleAuthenticationInfo("", administrators.getPassword(), "");

}

}

控制层用户密码登录

//用户名登录

@ApiOperation(value = "管理员登录", notes = "用户名登录--不进行拦截")

@PostMapping("/doLogin")

public String doLogin(@RequestParam("username") String username,

@RequestParam("password") String password,

HttpSession session,Model model) {

// 获取当前的用户

Subject subject = SecurityUtils.getSubject();

// 封装用户的登录数据

UsernamePasswordToken token = new UsernamePasswordToken(username, password);

try {

subject.login(token);

//保存session会话 管理员名字

session.setAttribute("adname", username);

return "admin";

} catch (UnknownAccountException e) {

model.addAttribute("usererror", "用户名错误!请重新输入。");

return "login";

} catch (IncorrectCredentialsException ice) {

model.addAttribute("pwerror", "密码错误!请重新输入。");

return "login";

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:IDEA利用jclasslib 修改class文件的实现
下一篇:网络安全态势前端展示(网络安全行业动态)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~