原生的整合
创建项目
创建一个 spring boot 项目,只需要添加 web 依赖即可:
项目创建成功后,加入 shiro 相关的依赖,完整的 pom.xml 文件中的依赖如下:
<dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-web</artifactid> <version>1.4.0</version> </dependency> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-spring</artifactid> <version>1.4.0</version> </dependency></dependencies>
创建 realm
接下来我们来自定义核心组件 realm:
public class myrealm extends authorizingrealm { @override protected authorizationinfo dogetauthorizationinfo(principalcollection principals) { return null; } @override protected authenticationinfo dogetauthenticationinfo(authenticationtoken token) throws authenticationexception { string username = (string) token.getprincipal(); if (!javaboy.equals(username)) { throw new unknownaccountexception(账户不存在!); } return new simpleauthenticationinfo(username, 123, getname()); }}
在 realm 中实现简单的认证操作即可,不做授权,授权的具体写法和 ssm 中的 shiro 一样,不赘述。这里的认证表示用户名必须是 javaboy ,用户密码必须是 123 ,满足这样的条件,就能登录成功!
配置 shiro
接下来进行 shiro 的配置:
@configurationpublic class shiroconfig { @bean myrealm myrealm() { return new myrealm(); } @bean securitymanager securitymanager() { defaultwebsecuritymanager manager = new defaultwebsecuritymanager(); manager.setrealm(myrealm()); return manager; } @bean shirofilterfactorybean shirofilterfactorybean() { shirofilterfactorybean bean = new shirofilterfactorybean(); bean.setsecuritymanager(securitymanager()); bean.setloginurl(/login); bean.setsuccessurl(/index); bean.setunauthorizedurl(/unauthorizedurl); map<string, string> map = new linkedhashmap<>(); map.put(/dologin, anon); map.put(/**, authc); bean.setfilterchaindefinitionmap(map); return bean; }}
在这里进行 shiro 的配置主要配置 3 个 bean :
首先需要提供一个 realm 的实例。
在配置 realm 时,需要在 securitymanager 中对其进行设置。
配置一个 shirofilterfactorybean ,在 shirofilterfactorybean 中指定路径拦截规则等。
配置登录和测试接口。
其中,shirofilterfactorybean 的配置稍微多一些,配置含义如下:
setsecuritymanager 表示指定 securitymanager。
setloginurl 表示指定登录页面。
setsuccessurl 表示指定登录成功页面。
接下来的 map 中配置了路径拦截规则,注意,要有序。
这些东西都配置完成后,接下来配置登录 controller:
@restcontrollerpublic class logincontroller { @postmapping(/dologin) public void dologin(string username, string password) { subject subject = securityutils.getsubject(); try { subject.login(new usernamepasswordtoken(username, password)); system.out.println(登录成功!); } catch (authenticationexception e) { e.printstacktrace(); system.out.println(登录失败!); } } @getmapping(/hello) public string hello() { return hello; } @getmapping(/login) public string login() { return please login!; }}
测试时,首先访问 /hello 接口,由于未登录,所以会自动跳转到 /login 接口:
然后调用 /dologin 接口完成登录:
再次访问 /hello 接口,就可以成功访问了:
使用 shiro starter
上面这种配置方式实际上相当于把 ssm 中的 xml 配置拿到 spring boot 中用 java 代码重新写了一遍,除了这种方式之外,我们也可以直接使用 shiro 官方提供的 starter 。
创建工程,和上面的一样
创建成功后,添加 shiro-spring-boot-web-starter ,这个依赖可以代替之前的 shiro-web 和 shiro-spring 两个依赖,pom.xml 文件如下:
<dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-spring-boot-web-starter</artifactid> <version>1.4.0</version> </dependency></dependencies>
创建 realm
这里的 realm 和前面的一样,我就不再赘述。
配置 shiro 基本信息
接下来在 application.properties 中配置 shiro 的基本信息:
shiro.sessionmanager.sessionidcookieenabled=trueshiro.sessionmanager.sessionidurlrewritingenabled=trueshiro.unauthorizedurl=/unauthorizedurlshiro.web.enabled=trueshiro.successurl=/indexshiro.loginurl=/login
配置解释:
第一行表示是否允许将sessionid 放到 cookie 中
第二行表示是否允许将 sessionid 放到 url 地址拦中
第三行表示访问未获授权的页面时,默认的跳转路径
第四行表示开启 shiro
第五行表示登录成功的跳转页面
第六行表示登录页面
配置 shiroconfig
@configurationpublic class shiroconfig { @bean myrealm myrealm() { return new myrealm(); } @bean defaultwebsecuritymanager securitymanager() { defaultwebsecuritymanager manager = new defaultwebsecuritymanager(); manager.setrealm(myrealm()); return manager; } @bean shirofilterchaindefinition shirofilterchaindefinition() { defaultshirofilterchaindefinition definition = new defaultshirofilterchaindefinition(); definition.addpathdefinition(/dologin, anon); definition.addpathdefinition(/**, authc); return definition; }}
以上就是springboot中怎么对shiro进行整合的详细内容。