grails 2.3.7 connect to remote postgresql server - postgresql

In my BuildConfig.groovy
I have :
dependencies {
runtime 'org.postgresql:postgresql:9.3-1100-jdbc41'
}
In my DataSource.groovy
I have :
dataSource {
pooled = true
driverClassName = "org.postgresql.Driver"
dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate {
cache.use_second_level_cache=true
cache.use_query_cache=true
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop','update'
url = "jdbc:postgresql://ip:5432/security_dev"
username = "uname"
password = "pwd"
}
}
test {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop','update'
url = "jdbc:postgresql://ip:5432/security_dev"
username = "uname"
password = "pwd"
}
}
production {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop','update'
url = "jdbc:postgresql://ip:5432/security_dev"
username = "uname"
password = "pwd"
}
}
}
}
Here are the error message
2014-04-08 15:02:48,390 [localhost-startStop-1] ERROR pool.ConnectionPool - Unable to create initial connections of pool.
Message: Driver:org.postgresql.Driver#afd862b returned null for URL:jdbc:h2:mem:grailsDB;MVCC=TRUE;LOCK_TIMEOUT=10000
Line | Method
->> 262 | run in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 744 | run in java.lang.Thread
Error |
2014-04-08 15:02:48,708 [localhost-startStop-1] ERROR pool.ConnectionPool - Unable to create initial connections of pool.
Message: Driver:org.postgresql.Driver#30535975 returned null for URL:jdbc:h2:mem:grailsDB;MVCC=TRUE;LOCK_TIMEOUT=10000
Line | Method
->> 262 | run in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 744 | run in java.lang.Thread
Error |
2014-04-08 15:02:48,723 [localhost-startStop-1] ERROR pool.ConnectionPool - Unable to create initial connections of pool.
Message: Driver:org.postgresql.Driver#563105a6 returned null for URL:jdbc:h2:mem:grailsDB;MVCC=TRUE;LOCK_TIMEOUT=10000
Line | Method
->> 262 | run in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 744 | run in java.lang.Thread
|Server running. Browse to http://localhost:8080/Postgresql_Grails_2.3.7
This configuration works for grails 2.2.4
What I have to do to make it work under grails 2.3.7?
Thanks in advance

I had the same problem after my upgrade. This is my dependencies (jdbc4 and not jdbc41):
dependencies {
runtime 'org.postgresql:postgresql:9.3-1100-jdbc4'
}
And I don't know if it is the problem, but I think you left '}' before hibernate:
dataSource {
pooled = true
driverClassName = "org.postgresql.Driver"
username = "username"
password = "password"
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
singleSession = true
}

Related

How to connect multiple slave devices under the modbus-serial (rtu) connector

this is my Configuration File. I'm using the new profile https://thingsboard.io/docs/iot-gateway/config/modbus/ [new_modbus.json], in the new configuration file, seems to be able to configure several different devices in { master : { "slaves" : [] }}. And when I do, I couldn't get the right results.
{
"master":{
"slaves":[
{
"unitId":1,
"deviceName":"test1",
"attributesPollPeriod":5000,
"timeseriesPollPeriod":5000,
"sendDataOnlyOnChange":false,
"attributes":[
{
"byteOrder":"BIG",
"tag":"temperature",
"type":"bytes",
"functionCode":3,
"registerCount":1,
"address":1
}
],
"timeseries":[
{
"tag":"distance",
"type":"bytes",
"functionCode":3,
"objectsCount":1,
"address":2
}
],
"attributeUpdates":[
{
"tag":"shared_value_1",
"type":"32uint",
"functionCode":6,
"objectsCount":2,
"address":3
},
{
"tag":"shared_value_2",
"type":"32uint",
"functionCode":6,
"objectsCount":2,
"address":4
}
],
"rpc":[
{
"tag":"bearing_bpfo",
"type":"32uint",
"functionCode":6,
"objectsCount":2,
"address":5
}
],
"host":null,
"port":"/dev/ttyUSB0",
"type":"serial",
"method":"rtu",
"timeout":35,
"byteOrder":"BIG",
"wordOrder":"BIG",
"retries":null,
"retryOnEmpty":null,
"retryOnInvalid":null,
"baudrate":9600,
"pollPeriod":5000,
"connectAttemptCount":1
},
{
"unitId":2,
"deviceName":"Test2",
"attributesPollPeriod":5000,
"timeseriesPollPeriod":5000,
"sendDataOnlyOnChange":false,
"attributes":[
{
"byteOrder":"BIG",
"tag":"temperature",
"type":"bytes",
"functionCode":3,
"registerCount":1,
"address":10
}
],
"timeseries":[
{
"tag":"distance",
"type":"bytes",
"functionCode":3,
"objectsCount":1,
"address":11
}
],
"attributeUpdates":[
{
"tag":"shared_value_1",
"type":"32uint",
"functionCode":6,
"objectsCount":2,
"address":12
}
],
"host":null,
"port":"/dev/ttyUSB0",
"type":"serial",
"method":"rtu",
"timeout":35,
"byteOrder":"BIG",
"wordOrder":"BIG",
"retries":null,
"retryOnEmpty":null,
"retryOnInvalid":null,
"baudrate":9600,
"pollPeriod":5000,
"connectAttemptCount":5
}
]
},
"slave":null
}
The Connector name I am using is the Modbus Connector, and the version information for my deployment is as follows:
OS: Raspberry Pi
Thingsboard IoT Gateway version : 3.0.1
Python version : 3.9.2
Error traceback:
""2022-05-11 15:28:10" - |DEBUG| - [bytes_modbus_uplink_converter.py] - bytes_modbus_uplink_converter - convert - 87 - datatype: telemetry key: distance value: None"
""2022-05-11 15:28:10" - |DEBUG| - [bytes_modbus_uplink_converter.py] - bytes_modbus_uplink_converter - convert - 92 - {'deviceName': 'testUpdate', 'deviceType': 'default', 'telemetry': [], 'attributes': []}"
""2022-05-11 15:28:10" - |ERROR| - [bytes_modbus_uplink_converter.py] - bytes_modbus_uplink_converter - convert - 83 - Modbus Error: [Input/Output] device reports readiness to read but returned no data (device disconnected or multiple access on port?)"
NoneType: None
""2022-05-11 15:28:10" - |DEBUG| - [bytes_modbus_uplink_converter.py] - bytes_modbus_uplink_converter - convert - 87 - datatype: telemetry key: distance value: None"
""2022-05-11 15:28:10" - |DEBUG| - [bytes_modbus_uplink_converter.py] - bytes_modbus_uplink_converter - convert - 92 - {'deviceName': 'RpcTest', 'deviceType': 'default', 'telemetry': [], 'attributes': []}"
""2022-05-11 15:28:10" - |ERROR| - [bytes_modbus_uplink_converter.py] - bytes_modbus_uplink_converter - convert - 83 - Modbus Error: [Input/Output] device reports readiness to read but returned no data (device disconnected or multiple access on port?)"
NoneType: None

(<unknown>): did not find expected alphabetic or numeric character while scanning an anchor at line 74 column 16

(full file: http://pastebin.com/jpTn5wqH)
groups:
Member:
options:
default: true
prefix: '&f[&7Nomad&f]’
permissions:
- essentials.kits.Nomad
- essentials.kit.Nomad
- bungeechat.global
- bungeecord.command.server
- essentials.msg
- essentials.message
- towny.leave
- essentials.mail
- essentials.mail.send
- essentials.warp.list
- essentials.warp
- libsdisguise.disguise.*
- essentials.balancetop
- essentials.balance
- bukkit.command.plugins
- towny.command.town.add
- towny.claimed.owntown.build.*
- ChestShop.shop.buy
- ChestShop.shop.sell
- ChestShop.shop.create
- essentials.plugins
- essentials.ping
- essentials.rules
- essentials.balance.others
- MyPet.command.trade.offer
- essentials.killall
- bukkit.plugins
- bukkit.plugin
- essentials.kit.peasant
- essentials.pay
- ontime.player.*
- towny.chat.town
- towny.chat.general
- towny.wild.*
- towny.command.town.buy
- towny.command.plot.claim
- mcmmo.repair.*
- essentials.ignore
- essentials.money
- essentials.help
- essentials.build
- essentials.list
- essentials.help
- essentials.kit
- essentials.spawn
- essentials.afk
- essentials.r
- essentials.respond
- essentials.talk
- essentials.home
- essentials.tpdeny
- essentials.tpaccept
- essentials.tpask
- essentials.tpa
- essentials.sethome
- essentials.delhome
- auctions.command.start
- auctions.command.info
- auctions.command.queue
- auctions.command.end
- auctions.command.ignore
- auctions.command.bid
- auctions.command.cancel
inheritance:
- Member
Builder:
options:
prefix: '&0[&2Builder&0]&r'
inheritance:
- Member
permissions:
- worldguard.region.bypass.world
- essentials.gamemode.Adventure
- essentials.gamemode.survival
- essentials.gamemode.spectator
- essentials.gamemode.creative
- essentials.mute
- essentials.gamemode.others
- essentials.gamemode.*
- essentials.gamemode
- worldedit.*
Head Builder:
options:
prefix: '&r[&aHead Builder&r]&r' # line 74
inheritance:
- Builder
- Member
- King
Perms For PermX Minecraft Plugin
What is wrong with the file?
Your YAML file starts with:
groups:
Member:
options:
default: true
prefix: '&f[&7Nomad&f]’
permissions:
- essentials.kits.Nomad
- essentials.kit.Nomad
and around line 74 has:
Builder:
options:
prefix: '&0[&2Builder&0]&r'
inheritance:
- Member
permissions:
- worldguard.region.bypass.world
- essentials.gamemode.Adventure
The line:
prefix: '&f[&7Nomad&f]’
starts a string (with the ') that ends on the line 74 followed by an unexpected character. You most likely want to change the ’ at the end of that line 5, as it is probably a typo and should be '.
With that change the file parses correctly.

Error initializing the application: No datastore implementation specified Message: No datastore implementation specified

I want to use the 'ElasticSearch' plug-in in Grails2.5 with the MongoDB. My 'BuildConfig.groovy' file is-:
grails.servlet.version = "3.0" // Change depending on target container compliance (2.5 or 3.0)
grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports"
grails.project.work.dir = "target/work"
grails.project.target.level = 1.6
grails.project.source.level = 1.6
//grails.project.war.file = "target/${appName}-${appVersion}.war"
grails.project.fork = [
// configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required
// compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
// configure settings for the test-app JVM, uses the daemon by default
test: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
// configure settings for the run-app JVM
run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
// configure settings for the run-war JVM
war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
// configure settings for the Console UI JVM
console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256]
]
grails.project.dependency.resolver = "maven" // or ivy
grails.project.dependency.resolution =
{
// inherit Grails' default dependencies
inherits("global") {
// specify dependency exclusions here; for example, uncomment this to disable ehcache:
// excludes 'ehcache'
}
log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
checksums true // Whether to verify checksums on resolve
legacyResolve false // whether to do a secondary resolve on plugin installation, not advised and here for backwards compatibility
repositories {
inherits true // Whether to inherit repository definitions from plugins
grailsPlugins()
grailsHome()
mavenLocal()
grailsCentral()
mavenCentral()
// uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories
//mavenRepo "http://repository.codehaus.org"
//mavenRepo "http://download.java.net/maven/2/"
//mavenRepo "http://repository.jboss.com/maven2/"
}
dependencies {
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
// runtime 'mysql:mysql-connector-java:5.1.29'
// runtime 'org.postgresql:postgresql:9.3-1101-jdbc41'
//runtime "org.elasticsearch:elasticsearch:0.90.3"
//runtime "org.elasticsearch:elasticsearch-lang-groovy:1.5.0"
test "org.grails:grails-datastore-test-support:1.0.2-grails-2.4"
}
plugins {
// plugins for the build system only
build ":tomcat:7.0.55.2" // or ":tomcat:8.0.20"
// plugins for the compile step
compile ":scaffolding:2.1.2"
compile ':cache:1.1.8'
compile ":asset-pipeline:2.1.5"
compile ':mongodb:3.0.3'
// plugins needed at runtime but not for compilation
//runtime ":hibernate4:4.3.8.1" // or ":hibernate:3.6.10.18"
runtime ":database-migration:1.4.0"
runtime ":jquery:1.11.1"
runtime ":elasticsearch:0.0.4.4"
// Uncomment these to enable additional asset-pipeline capabilities
//compile ":sass-asset-pipeline:1.9.0"
//compile ":less-asset-pipeline:1.10.0"
//compile ":coffee-asset-pipeline:1.8.0"
//compile ":handlebars-asset-pipeline:1.3.0.3"
}
}
Also my 'Config.groovy' file is-:
// locations to search for config files that get merged into the main config;
// config files can be ConfigSlurper scripts, Java properties files, or classes
// in the classpath in ConfigSlurper format
// grails.config.locations = [ "classpath:${appName}-config.properties",
// "classpath:${appName}-config.groovy",
// "file:${userHome}/.grails/${appName}-config.properties",
// "file:${userHome}/.grails/${appName}-config.groovy"]
// if (System.properties["${appName}.config.location"]) {
// grails.config.locations << "file:" + System.properties["${appName}.config.location"]
// }
grails.project.groupId = appName // change this to alter the default package name and Maven publishing destination
// The ACCEPT header will not be used for content negotiation for user agents containing the following strings (defaults to the 4 major rendering engines)
grails.mime.disable.accept.header.userAgents = ['Gecko', 'WebKit', 'Presto', 'Trident']
grails.mime.types = [ // the first one is the default format
all: '*/*', // 'all' maps to '*' or the first available format in withFormat
atom: 'application/atom+xml',
css: 'text/css',
csv: 'text/csv',
form: 'application/x-www-form-urlencoded',
html: ['text/html','application/xhtml+xml'],
js: 'text/javascript',
json: ['application/json', 'text/json'],
multipartForm: 'multipart/form-data',
rss: 'application/rss+xml',
text: 'text/plain',
hal: ['application/hal+json','application/hal+xml'],
xml: ['text/xml', 'application/xml']
]
// URL Mapping Cache Max Size, defaults to 5000
//grails.urlmapping.cache.maxsize = 1000
// Legacy setting for codec used to encode data with ${}
grails.views.default.codec = "html"
// The default scope for controllers. May be prototype, session or singleton.
// If unspecified, controllers are prototype scoped.
grails.controllers.defaultScope = 'singleton'
// GSP settings
grails {
views {
gsp {
encoding = 'UTF-8'
htmlcodec = 'xml' // use xml escaping instead of HTML4 escaping
codecs {
expression = 'html' // escapes values inside ${}
scriptlet = 'html' // escapes output from scriptlets in GSPs
taglib = 'none' // escapes output from taglibs
staticparts = 'none' // escapes output from static template parts
}
}
// escapes all not-encoded output at final stage of outputting
// filteringCodecForContentType.'text/html' = 'html'
}
}
grails.converters.encoding = "UTF-8"
// scaffolding templates configuration
grails.scaffolding.templates.domainSuffix = 'Instance'
// Set to false to use the new Grails 1.2 JSONBuilder in the render method
grails.json.legacy.builder = false
// enabled native2ascii conversion of i18n properties files
grails.enable.native2ascii = true
// packages to include in Spring bean scanning
grails.spring.bean.packages = []
// whether to disable processing of multi part requests
grails.web.disable.multipart=false
// request parameters to mask when logging exceptions
grails.exceptionresolver.params.exclude = ['password']
// configure auto-caching of queries by default (if false you can cache individual queries with 'cache: true')
grails.hibernate.cache.queries = false
// configure passing transaction's read-only attribute to Hibernate session, queries and criterias
// set "singleSession = false" OSIV mode in hibernate configuration after enabling
grails.hibernate.pass.readonly = false
// configure passing read-only to OSIV session by default, requires "singleSession = false" OSIV mode
grails.hibernate.osiv.readonly = false
environments {
development {
grails.logging.jul.usebridge = true
}
production {
grails.logging.jul.usebridge = false
// TODO: grails.serverURL = "http://www.changeme.com"
}
}
// log4j configuration
log4j.main = {
// Example of changing the log pattern for the default console appender:
//
//appenders {
// console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
//}
error 'org.codehaus.groovy.grails.web.servlet', // controllers
'org.codehaus.groovy.grails.web.pages', // GSP
'org.codehaus.groovy.grails.web.sitemesh', // layouts
'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
'org.codehaus.groovy.grails.web.mapping', // URL mapping
'org.codehaus.groovy.grails.commons', // core / classloading
'org.codehaus.groovy.grails.plugins', // plugins
'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
'org.springframework',
'org.hibernate',
'net.sf.ehcache.hibernate'
}
/****************************** adding from the site *******************************/
elasticSearch {
/**
* Date formats used by the unmarshaller of the JSON responses
*/
elasticSearch.datastoreImpl="mongodbDatastore"
date.formats = ["yyyy-MM-dd'T'HH:mm:ss'Z'"]
/**
* Hosts for remote ElasticSearch instances.
* Will only be used with the "transport" client mode.
* If the client mode is set to "transport" and no hosts are defined, ["localhost", 9300] will be used by default.
*/
client.hosts = [
[host:'localhost', port:9300]
]
/**
* Default mapping property exclusions
*
* No properties matching the given names will be mapped by default
* ie, when using "searchable = true"
*
* This does not apply for classes using mapping by closure
*/
defaultExcludedProperties = ["password"]
/**
* Determines if the plugin should reflect any database save/update/delete automatically
* on the ES instance. Default to false.
*/
disableAutoIndex = false
/**
* Should the database be indexed at startup.
*
* The value may be a boolean true|false.
* Indexing is always asynchronous (compared to Searchable plugin) and executed after BootStrap.groovy.
*/
bulkIndexOnStartup = true
/**
* Max number of requests to process at once. Reduce this value if you have memory issue when indexing a big amount of data
* at once. If this setting is not specified, 500 will be use by default.
*/
maxBulkRequest = 500
/**
* The name of the ElasticSearch mapping configuration property that annotates domain classes. The default is 'searchable'.
*/
searchableProperty.name = 'searchable'
}
environments {
development {
/**
* Possible values : "local", "node", "dataNode", "transport"
* If set to null, "node" mode is used by default.
*/
elasticSearch.client.mode = 'local'
}
test {
elasticSearch {
client.mode = 'local'
index.store.type = 'memory' // store local node in memory and not on disk
}
}
production {
elasticSearch.client.mode = 'node'
}
}
But wile running the app , the following error is coming-:
|Loading Grails 2.5.0
|Configuring classpath
.
|Environment set to development
.................................
|Packaging Grails application
....
|Compiling 1 source files
...................................
|Running Grails application
Error |
2015-06-01 16:40:59,813 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener - Error initializing the application: No datastore implementation specified
Message: No datastore implementation specified
Line | Method
->> 135 | doCall in ElasticsearchGrailsPlugin$_closure1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 754 | invokeBeanDefiningClosure in grails.spring.BeanBuilder
| 584 | beans . . . . . . . . . . in ''
| 527 | invokeMethod in ''
| 266 | run . . . . . . . . . . . in java.util.concurrent.FutureTask
| 1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 617 | run . . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run in java.lang.Thread
Error |
Forked Grails VM exited with errorJava HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
|Loading Grails 2.5.0
|Configuring classpath
.
|Environment set to development
.................................
|Packaging Grails application
....
|Compiling 1 source files
...................................
|Running Grails application
Error |
2015-06-01 16:40:59,813 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener - Error initializing the application: No datastore implementation specified
Message: No datastore implementation specified
Line | Method
->> 135 | doCall in ElasticsearchGrailsPlugin$_closure1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 754 | invokeBeanDefiningClosure in grails.spring.BeanBuilder
| 584 | beans . . . . . . . . . . in ''
| 527 | invokeMethod in ''
| 266 | run . . . . . . . . . . . in java.util.concurrent.FutureTask
| 1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 617 | run . . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run in java.lang.Thread
Error |
Forked Grails VM exited with errorJava HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
I suspect you have to changes this line
elasticSearch.datastoreImpl="mongodbDatastore"
to
datastoreImpl="mongodbDatastore"
as you're already nested in elasticSearch namespace.

Grails Spring Security REST Plugin - Token Storage Failure

I'm setting up a Grails project with the Spring Security REST Plugin and I'm having some trouble. When I make the following request to /api/login with valid username and password
Accept: application/json
Content-Type: application/json
{
"username": "validuser",
"password": "validpassword"
}
I get the following exceptions
Error 2014-08-09 11:30:04,839 [http-bio-8080-exec-6] ERROR [/myphotoid-api].[default] - Servlet.service() for servlet [default] in context with path [/myphotoid-api] threw exception
Message: java.lang.Class cannot be cast to java.lang.String
Line | Method
->> 38 | storeToken in com.odobo.grails.plugin.springsecurity.rest.token.storage.GormTokenStorageService
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 97 | doFilter in com.odobo.grails.plugin.springsecurity.rest.RestAuthenticationFilter
| 82 | doFilter . in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
| 63 | doFilter in com.odobo.grails.plugin.springsecurity.rest.RestLogoutFilter
| 82 | doFilter . in com.brandseye.cors.CorsFilter
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run in java.lang.Thread
and then my client receives a 302 to /login/auth, the regular stateful login page. :(
However if I make the following request to /api/login with an invalid username and password
Accept: application/json
Content-Type: application/json
{
"username": "validuser",
"password": "badpassword"
}
I get a 401, which I guess is what I should expect.
Here is the valid section from my Config.groovy
// Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'com.campuscardtools.myphotoid.Person'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'com.campuscardtools.myphotoid.PersonRole'
grails.plugin.springsecurity.authority.className = 'com.campuscardtools.myphotoid.Role'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
'/api/login': ['permitAll'],
'/': ['permitAll'],
'/index': ['permitAll'],
'/index.gsp': ['permitAll'],
'/assets/**': ['permitAll']
]
grails.plugin.springsecurity.rest.token.storage.useGorm = true
grails.plugin.springsecurity.rest.token.storage.gorm.tokenDomainClassName = com.campuscardtools.myphotoid.AuthenticationToken
grails.plugin.springsecurity.filterChain.chainMap = [
'/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter', // Stateless chain
'/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter' // Traditional chain
]
Thank you in advance for your help!
#kau Thanks for the helpful comment.
Looks like your tokenDomainClassName needs to be enclosed within quotes – kau Aug 22 at 14:01
so I changed this
grails.plugin.springsecurity.rest.token.storage.gorm.tokenDomainClassName = com.campuscardtools.myphotoid.AuthenticationToken
to this
grails.plugin.springsecurity.rest.token.storage.gorm.tokenDomainClassName = 'com.campuscardtools.myphotoid.AuthenticationToken'
Check plugin confiugraiton section in documentation : http://alvarosanchez.github.io/grails-spring-security-rest/docs/guide/configuration.html
You have to configure chains properly in grails.plugin.springsecurity.filterChain.chainMap:
grails.plugin.springsecurity.filterChain.chainMap = [
'/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter', // Stateless chain
'/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter' // Traditional chain
]

Creating extra folder in views with Zend?

With the default structure:
application
- controllers
- - IndexController.php
- models
- views
- - scripts
- - - index
- - - - index.phtml
- - - - create.phtml
My IndexController.php in my controllers folder would look like:
class IndexController extends Zend_Controller_Action { ... }
If I wanted to add a folder inside like this:
application
- controllers
- - IndexController.php
- models
- views
- - scripts
- - - index
- - - - posts
- - - - - index.phtml
- - - - - create.phtml
- - - - index.phtml
- - - - create.phtml
At what path and what file name do I create the controller for my posts indexAction and createAction? Also, which controller do you extend and how do you name it?
When you create a new action (ie: postsAction()) you need to create a file that matches the name of your action in the controllers view scripts directory (in this case postsAction() exists in indexController)
So what you need is this:
application
- controllers
- - IndexController.php
- views
- - scripts
- - - index
- - - - posts.phtml
- - - - index.phtml
- - - - create.phtml
If you want a structure so that you have /posts/index or /posts/create then you likely want to have a postsController which will contain something that looks like this:
application
- controllers
- - IndexController.php
- - PostsController.php
- models
- views
- - scripts
- - - index
- - - - index.phtml
- - - - create.phtml
- - - posts
- - - - index.phtml
- - - - create.phtml
If you want /index/posts-create as an action in your indexController your will need a directory structure like this - note: When you use an action with camelCase (postsCreateAction()) zend framework converts it to all lowercase with dashes for both the URL and the view scripts.
application
- controllers
- - IndexController.php
- models
- views
- - scripts
- - - index
- - - - index.phtml
- - - - create.phtml
- - - - posts-create.phtml
You may also want to include a default ErrorController - it will be helpful in the future.
if you define your actions camelCase like:
public function showUsersFromSpaceAction()
{
}
your url will be:
index/show-users-from-space
and your view script:
/views/index/show-users-from-space.phtml